diff options
-rw-r--r-- | misc/dahdi-kmod/Makefile | 13 | ||||
-rw-r--r-- | misc/dahdi-kmod/distinfo | 12 | ||||
-rw-r--r-- | misc/dahdi-kmod/files/patch-bchan | 5 | ||||
-rw-r--r-- | misc/dahdi-kmod/files/patch-freebsd-freebsd-Makefile | 12 | ||||
-rw-r--r-- | misc/dahdi-kmod/files/patch-oslec | 29 | ||||
-rw-r--r-- | misc/dahdi-kmod/files/patch-zaphfc | 744 | ||||
-rw-r--r-- | misc/dahdi-kmod/pkg-plist | 2 | ||||
-rw-r--r-- | misc/dahdi/Makefile | 13 | ||||
-rw-r--r-- | misc/dahdi/distinfo | 12 | ||||
-rw-r--r-- | misc/dahdi/files/patch-bchan | 5 | ||||
-rw-r--r-- | misc/dahdi/files/patch-freebsd-freebsd-Makefile | 12 | ||||
-rw-r--r-- | misc/dahdi/files/patch-oslec | 29 | ||||
-rw-r--r-- | misc/dahdi/files/patch-zaphfc | 744 | ||||
-rw-r--r-- | misc/dahdi/pkg-plist | 2 |
14 files changed, 1626 insertions, 8 deletions
diff --git a/misc/dahdi-kmod/Makefile b/misc/dahdi-kmod/Makefile index 992e22e94519..2828275726f0 100644 --- a/misc/dahdi-kmod/Makefile +++ b/misc/dahdi-kmod/Makefile @@ -12,6 +12,10 @@ CATEGORIES= misc kld MASTER_SITES= ${MASTER_SITE_LOCAL} MASTER_SITE_SUBDIR= fjoe DISTNAME= ${PORTNAME}-freebsd-complete-${DAHDI_VERSION}+${DAHDI_TOOLS_VERSION} +DISTFILES= ${DISTNAME}${EXTRACT_SUFX}\ + oslec-linux-${OSLEC_VERSION}${EXTRACT_SUFX}\ + zaphfc-${ZAPHFC_VERSION}${EXTRACT_SUFX} +EXTRA_PATCHES= ${WRKDIR}/zaphfc-${ZAPHFC_VERSION} MAINTAINER= fjoe@FreeBSD.org COMMENT= Digium/Asterisk Hardware Device Interface @@ -19,8 +23,10 @@ COMMENT= Digium/Asterisk Hardware Device Interface BUILD_DEPENDS= gmake:${PORTSDIR}/devel/gmake LIB_DEPENDS= newt.52:${PORTSDIR}/devel/newt -DAHDI_VERSION= 2.4.0-rc3 +DAHDI_VERSION= 2.4.0-rc4 DAHDI_TOOLS_VERSION= 2.4.0-rc1 +OSLEC_VERSION= 2.6.35.4 +ZAPHFC_VERSION= r5 NO_PACKAGE= Should be in sync with the kernel to work correctly GNU_CONFIGURE= yes @@ -28,6 +34,7 @@ CONFIGURE_ARGS= --with-dahdi=../freebsd --sysconfdir=${PREFIX}/etc --with-newt=$ CONFIGURE_ENV= WGET=/usr/bin/fetch USE_LDCONFIG= yes USE_RC_SUBR= dahdi +MAKE_ARGS= ADDITIONAL_DRIVERS="wcb1xxp" ONLY_FOR_ARCHS= i386 amd64 sparc64 CONFLICTS= zaptel-[0-9]* @@ -58,6 +65,10 @@ pre-everything:: ${FALSE}; \ fi +post-extract: + @${LN} -s ../../../linux-${OSLEC_VERSION}/drivers/staging ${WRKSRC}/freebsd/drivers + @${REINPLACE_CMD} -E -e 's,(new|old)/,freebsd/,g' ${WRKDIR}/zaphfc-${ZAPHFC_VERSION} + post-patch: @${REINPLACE_CMD} -e 's,/etc,${PREFIX}/etc,g'\ ${WRKSRC}/tools/dahdi_cfg.c ${WRKSRC}/tools/fxotune.c\ diff --git a/misc/dahdi-kmod/distinfo b/misc/dahdi-kmod/distinfo index 4fd504636928..54e4b9788cd5 100644 --- a/misc/dahdi-kmod/distinfo +++ b/misc/dahdi-kmod/distinfo @@ -1,3 +1,9 @@ -MD5 (dahdi-freebsd-complete-2.4.0-rc3+2.4.0-rc1.tar.gz) = 72f236f905c6f8ac66e3bb4d781cffaa -SHA256 (dahdi-freebsd-complete-2.4.0-rc3+2.4.0-rc1.tar.gz) = fb31f1ca76fa89568ba9590a4d65f7e26ab69e45e09587bd0e3b2a97b93ade60 -SIZE (dahdi-freebsd-complete-2.4.0-rc3+2.4.0-rc1.tar.gz) = 2048903 +MD5 (dahdi-freebsd-complete-2.4.0-rc4+2.4.0-rc1.tar.gz) = 4246fd70cb196cbfd6eba16a9ce0e434 +SHA256 (dahdi-freebsd-complete-2.4.0-rc4+2.4.0-rc1.tar.gz) = 17530a885626ded8fb8d8dd6f04dbf3366e90bceda5a6a02a948d49a29ef8b4c +SIZE (dahdi-freebsd-complete-2.4.0-rc4+2.4.0-rc1.tar.gz) = 2049406 +MD5 (oslec-linux-2.6.35.4.tar.gz) = e63e8e7cc4d7338bcb8e526594a34495 +SHA256 (oslec-linux-2.6.35.4.tar.gz) = 01cfaa1ca64056c822d1a3ebf4f7b3c81127cd7b308ad5b0738ff4eb2026e261 +SIZE (oslec-linux-2.6.35.4.tar.gz) = 12057 +MD5 (zaphfc-r5.tar.gz) = 5fbc6110c01b60e6795b5e8424bb4790 +SHA256 (zaphfc-r5.tar.gz) = 7e809b62dcc2bd3caf2e5a882390051b881eb08d37fea1733d7fb55e80bc6756 +SIZE (zaphfc-r5.tar.gz) = 15639 diff --git a/misc/dahdi-kmod/files/patch-bchan b/misc/dahdi-kmod/files/patch-bchan index 897ab738bd79..4aa35a8b8163 100644 --- a/misc/dahdi-kmod/files/patch-bchan +++ b/misc/dahdi-kmod/files/patch-bchan @@ -1,3 +1,8 @@ +# Translate the D channels to a standard channel data. +# The HFC chipset provides us the D channel as data, but +# Zaptel expects it as a standard channel with 1000 samples +# per second. + Index: freebsd/include/dahdi/dahdi_config.h =================================================================== --- freebsd/include/dahdi/dahdi_config.h (revision 8781) diff --git a/misc/dahdi-kmod/files/patch-freebsd-freebsd-Makefile b/misc/dahdi-kmod/files/patch-freebsd-freebsd-Makefile new file mode 100644 index 000000000000..719fc111e697 --- /dev/null +++ b/misc/dahdi-kmod/files/patch-freebsd-freebsd-Makefile @@ -0,0 +1,12 @@ +--- freebsd/freebsd/Makefile.orig 2010-09-01 01:13:18.000000000 +0700 ++++ freebsd/freebsd/Makefile 2010-09-01 01:13:33.000000000 +0700 +@@ -51,6 +51,9 @@ + wctc4xxp\ + dahdi-fw-tc400m.bin + ++# Additional drivers ++SUBDIR+= ${ADDITIONAL_DRIVERS} ++ + .if ${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "amd64" + _dahdi_vpmadt032_loader= dahdi_vpmadt032_loader + .endif diff --git a/misc/dahdi-kmod/files/patch-oslec b/misc/dahdi-kmod/files/patch-oslec new file mode 100644 index 000000000000..56eb68b89584 --- /dev/null +++ b/misc/dahdi-kmod/files/patch-oslec @@ -0,0 +1,29 @@ +diff -ru freebsd/drivers/staging/echo/echo.c.orig freebsd/drivers/staging/echo/echo.c.orig +--- freebsd/drivers/staging/echo/echo.c.orig 2010-08-27 06:47:12.000000000 +0700 ++++ freebsd/drivers/staging/echo/echo.c 2010-08-31 14:45:48.000000000 +0700 +@@ -102,9 +102,15 @@ + Mark, Pawel, and Pavel. + */ + ++#if defined(__FreeBSD__) ++#include <sys/types.h> ++#include <sys/libkern.h> ++#include <dahdi/compat/bsd.h> ++#else + #include <linux/kernel.h> + #include <linux/module.h> + #include <linux/slab.h> ++#endif /* !__FreeBSD__ */ + + #include "echo.h" + +@@ -656,7 +662,9 @@ + } + EXPORT_SYMBOL_GPL(oslec_hpf_tx); + ++#if !defined(__FreeBSD__) + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("David Rowe"); + MODULE_DESCRIPTION("Open Source Line Echo Canceller"); + MODULE_VERSION("0.3.0"); ++#endif /* !__FreeBSD__ */ diff --git a/misc/dahdi-kmod/files/patch-zaphfc b/misc/dahdi-kmod/files/patch-zaphfc new file mode 100644 index 000000000000..68fa04470388 --- /dev/null +++ b/misc/dahdi-kmod/files/patch-zaphfc @@ -0,0 +1,744 @@ +diff -ruN freebsd/drivers/dahdi/zaphfc.orig/base.c freebsd/drivers/dahdi/zaphfc/base.c +--- freebsd/drivers/dahdi/zaphfc.orig/base.c 2010-09-01 00:55:30.000000000 +0700 ++++ freebsd/drivers/dahdi/zaphfc/base.c 2010-09-01 03:03:20.000000000 +0700 +@@ -23,6 +23,50 @@ + * Please read the README file for important infos. + */ + ++#if defined(__FreeBSD__) ++#include <sys/types.h> ++#include <sys/bus.h> ++#include <sys/module.h> ++#include <dev/pci/pcireg.h> ++#include <dev/pci/pcivar.h> ++ ++#define PCI_VENDOR_ID_CCD 0x1397 ++ ++#define PCI_DEVICE_ID_CCD_2BD0 0x2bd0 ++#define PCI_DEVICE_ID_CCD_B000 0xb000 ++#define PCI_DEVICE_ID_CCD_B006 0xb006 ++#define PCI_DEVICE_ID_CCD_B007 0xb007 ++#define PCI_DEVICE_ID_CCD_B008 0xb008 ++#define PCI_DEVICE_ID_CCD_B009 0xb009 ++#define PCI_DEVICE_ID_CCD_B00A 0xb00a ++#define PCI_DEVICE_ID_CCD_B00B 0xb00b ++#define PCI_DEVICE_ID_CCD_B00C 0xb00c ++#define PCI_DEVICE_ID_CCD_B100 0xb100 ++ ++#define PCI_VENDOR_ID_ABOCOM 0x13D1 ++#define PCI_DEVICE_ID_ABOCOM_2BD1 0x2BD1 ++ ++#define PCI_VENDOR_ID_ANIGMA 0x1051 ++#define PCI_DEVICE_ID_ANIGMA_MC145575 0x0100 ++ ++#define PCI_VENDOR_ID_ASUSTEK 0x1043 ++#define PCI_DEVICE_ID_ASUSTEK_0675 0x0675 ++ ++#define PCI_VENDOR_ID_BERKOM 0x0871 ++#define PCI_DEVICE_ID_BERKOM_A1T 0xffa1 ++#define PCI_DEVICE_ID_BERKOM_T_CONCEPT 0xffa2 ++ ++#define PCI_VENDOR_ID_DIGI 0x114f ++#define PCI_DEVICE_ID_DIGI_DF_M_IOM2_E 0x0070 ++#define PCI_DEVICE_ID_DIGI_DF_M_E 0x0071 ++#define PCI_DEVICE_ID_DIGI_DF_M_IOM2_A 0x0072 ++#define PCI_DEVICE_ID_DIGI_DF_M_A 0x0073 ++ ++#define PCI_VENDOR_ID_ZOLTRIX 0x15b0 ++#define PCI_DEVICE_ID_ZOLTRIX_2BD0 0x2bd0 ++ ++#define set_current_state(x) ++#else /* !__FreeBSD__ */ + #include <linux/spinlock.h> + #include <linux/init.h> + #include <linux/pci.h> +@@ -34,14 +78,13 @@ + #include <linux/delay.h> + #include <linux/proc_fs.h> + #include <linux/if_arp.h> ++#endif /* !__FreeBSD__ */ + + #include <dahdi/kernel.h> + + #include "zaphfc.h" + #include "fifo.h" + +-#if CONFIG_PCI +- + #define DAHDI_B1 0 + #define DAHDI_B2 1 + #define DAHDI_D 2 +@@ -57,7 +100,9 @@ + static int nt_modes[hfc_MAX_BOARDS]; + static int nt_modes_count; + static int force_l1_up; ++#if !defined(__FreeBSD__) + static struct proc_dir_entry *hfc_proc_zaphfc_dir; ++#endif + + #ifdef DEBUG + int debug_level; +@@ -122,6 +167,31 @@ + {0,} + }; + ++#if defined(__FreeBSD__) ++static void ++hfc_release_resources(struct hfc_card *card) ++{ ++ /* disconnect the interrupt handler */ ++ if (card->irq_handle != NULL) { ++ bus_teardown_intr(card->pcidev->dev, card->irq_res, card->irq_handle); ++ card->irq_handle = NULL; ++ } ++ ++ if (card->irq_res != NULL) { ++ bus_release_resource(card->pcidev->dev, SYS_RES_IRQ, card->irq_rid, card->irq_res); ++ card->irq_res = NULL; ++ } ++ ++ /* release DMA resources */ ++ dahdi_dma_free(&card->dma_tag, &card->dma_map, (void **) &card->fifos, &card->dma_addr); ++ ++ /* release I/O range */ ++ if (card->mem_res != NULL) { ++ bus_release_resource(card->pcidev->dev, SYS_RES_MEMORY, card->mem_rid, card->mem_res); ++ card->mem_res = NULL; ++ } ++} ++#else + MODULE_DEVICE_TABLE(pci, hfc_pci_ids); + + static int __devinit hfc_probe(struct pci_dev *dev +@@ -134,6 +204,7 @@ + .probe = hfc_probe, + .remove = hfc_remove, + }; ++#endif /* !__FreeBSD__ */ + + /****************************************** + * HW routines +@@ -418,7 +489,7 @@ + + switch (chan->number) { + case D: +- if (chan->status != free && ++ if (chan->status != chan_free && + chan->status != open_framed) { + spin_unlock(&chan->lock); + return -EBUSY; +@@ -428,7 +499,7 @@ + + case B1: + case B2: +- if (chan->status != free) { ++ if (chan->status != chan_free) { + spin_unlock(&chan->lock); + return -EBUSY; + } +@@ -437,7 +508,7 @@ + } + + chan->open_by_zaptel = TRUE; +- try_module_get(THIS_MODULE); ++ (void) try_module_get(THIS_MODULE); + spin_unlock(&chan->lock); + + switch (chan->number) { +@@ -509,12 +580,12 @@ + + spin_lock(&chan->lock); + +- if (chan->status == free) { ++ if (chan->status == chan_free) { + spin_unlock(&chan->lock); + return -EINVAL; + } + +- chan->status = free; ++ chan->status = chan_free; + chan->open_by_zaptel = FALSE; + + spin_unlock(&chan->lock); +@@ -538,8 +609,8 @@ + break; + } + +- if (card->chans[B1].status == free && +- card->chans[B2].status == free) ++ if (card->chans[B1].status == chan_free && ++ card->chans[B2].status == chan_free) + card->regs.m2 &= ~hfc_M2_PROC_TRANS; + + hfc_outb(card, hfc_INT_M2, card->regs.m2); +@@ -591,7 +662,7 @@ + + static int hfc_zap_startup(struct dahdi_span *span) + { +- struct dahdi_hfc *zthfc = span->pvt; ++ struct dahdi_hfc *zthfc = container_of(span, struct dahdi_hfc, span); + struct hfc_card *hfctmp = zthfc->card; + int alreadyrunning; + +@@ -642,6 +713,20 @@ + return 0; + } + ++static const struct dahdi_span_ops hfc_zap_span_ops = { ++ .owner = THIS_MODULE, ++ .startup = hfc_zap_startup, ++ .shutdown = hfc_zap_shutdown, ++ .rbsbits = hfc_zap_rbsbits, ++ .maint = hfc_zap_maint, ++ .open = hfc_zap_open, ++ .close = hfc_zap_close, ++ .spanconfig = hfc_zap_spanconfig, ++ .chanconfig = hfc_zap_chanconfig, ++ .ioctl = hfc_zap_ioctl, ++ .hdlc_hard_xmit = hfc_hdlc_hard_xmit, ++}; ++ + static int hfc_zap_initialize(struct dahdi_hfc *hfccard) + { + struct hfc_card *hfctmp = hfccard->card; +@@ -655,23 +740,14 @@ + hfctmp->nt_mode ? "NT" : "TE"); + hfccard->span.spantype = hfctmp->nt_mode ? "NT" : "TE"; + hfccard->span.manufacturer = "Cologne Chips"; +- hfccard->span.spanconfig = hfc_zap_spanconfig; +- hfccard->span.chanconfig = hfc_zap_chanconfig; +- hfccard->span.startup = hfc_zap_startup; +- hfccard->span.shutdown = hfc_zap_shutdown; +- hfccard->span.maint = hfc_zap_maint; +- hfccard->span.rbsbits = hfc_zap_rbsbits; +- hfccard->span.open = hfc_zap_open; +- hfccard->span.close = hfc_zap_close; +- hfccard->span.ioctl = hfc_zap_ioctl; +- hfccard->span.hdlc_hard_xmit = hfc_hdlc_hard_xmit; ++ hfccard->span.ops = &hfc_zap_span_ops; + hfccard->span.flags = 0; +- hfccard->span.irq = hfctmp->pcidev->irq; ++ hfccard->span.irq = dahdi_pci_get_irq(hfctmp->pcidev); + dahdi_copy_string(hfccard->span.devicetype, "HFC-S PCI-A ISDN", + sizeof(hfccard->span.devicetype)); + sprintf(hfccard->span.location, "PCI Bus %02d Slot %02d", +- hfctmp->pcidev->bus->number, +- PCI_SLOT(hfctmp->pcidev->devfn) + 1); ++ dahdi_pci_get_bus(hfctmp->pcidev), ++ dahdi_pci_get_slot(hfctmp->pcidev)); + hfccard->span.chans = hfccard->_chans; + hfccard->span.channels = 3; + for (i = 0; i < hfccard->span.channels; i++) +@@ -680,7 +756,6 @@ + hfccard->span.linecompat = DAHDI_CONFIG_AMI | DAHDI_CONFIG_CCS; + hfccard->span.offset = 0; + init_waitqueue_head(&hfccard->span.maintq); +- hfccard->span.pvt = hfccard; + + for (i = 0; i < hfccard->span.channels; i++) { + memset(&hfccard->chans[i], 0x0, sizeof(struct dahdi_chan)); +@@ -760,22 +835,20 @@ + static void hfc_frame_arrived(struct hfc_chan_duplex *chan); + static void hfc_handle_voice(struct hfc_card *card); + +-#if (KERNEL_VERSION(2, 6, 24) < LINUX_VERSION_CODE) +-static irqreturn_t hfc_interrupt(int irq, void *dev_id) +-#else +-static irqreturn_t hfc_interrupt(int irq, void *dev_id, struct pt_regs *regs) +-#endif ++DAHDI_IRQ_HANDLER(hfc_interrupt) + { + struct hfc_card *card = dev_id; + unsigned long flags; + u8 status, s1, s2; + ++#if !defined(__FreeBSD__) + if (!card) { + printk(KERN_CRIT hfc_DRIVER_PREFIX + "spurious interrupt (IRQ %d)\n", + irq); + return IRQ_NONE; + } ++#endif /* !__FreeBSD__ */ + + spin_lock_irqsave(&card->lock, flags); + status = hfc_inb(card, hfc_STATUS); +@@ -1179,7 +1252,9 @@ + { + struct hfc_card *card = chan->card; + int antiloop = 16; ++#if !defined(__FreeBSD__) + struct sk_buff *skb; ++#endif + + while (hfc_fifo_has_frames(&chan->rx) && --antiloop) { + int frame_size = hfc_fifo_get_frame_size(&chan->rx); +@@ -1229,6 +1304,7 @@ + break; + } + ++#if !defined(__FreeBSD__) + skb = dev_alloc_skb(frame_size - 3); + + if (!skb) { +@@ -1254,6 +1330,7 @@ + #else + skb->ip_summed = CHECKSUM_HW; + #endif ++#endif /* !__FreeBSD__ */ + + if (chan->open_by_zaptel) { + card->chans[D].rx.ugly_framebuf_size = frame_size - 1; +@@ -1261,20 +1338,26 @@ + if (hfc_fifo_get_frame(&card->chans[D].rx, + card->chans[D].rx.ugly_framebuf, + frame_size - 1) == -1) { ++#if !defined(__FreeBSD__) + dev_kfree_skb(skb); ++#endif + continue; + } + ++#if !defined(__FreeBSD__) + memcpy(skb_put(skb, frame_size - 3), + card->chans[D].rx.ugly_framebuf, + frame_size - 3); ++#endif + } else { ++#if !defined(__FreeBSD__) + if (hfc_fifo_get_frame(&chan->rx, + skb_put(skb, frame_size - 3), + frame_size - 3) == -1) { + dev_kfree_skb(skb); + continue; + } ++#endif + } + } + +@@ -1289,8 +1372,12 @@ + * Module initialization and cleanup + ******************************************/ + ++#if defined(__FreeBSD__) ++static int hfc_probe(device_t dev) ++#else + static int __devinit hfc_probe(struct pci_dev *pci_dev, + const struct pci_device_id *ent) ++#endif + { + static int cardnum; + int err; +@@ -1298,6 +1385,12 @@ + + struct hfc_card *card = NULL; + struct dahdi_hfc *zthfc = NULL; ++ ++#if defined(__FreeBSD__) ++ card = device_get_softc(dev); ++ card->pcidev = &card->_dev; ++ card->pcidev->dev = dev; ++#else + card = kmalloc(sizeof(struct hfc_card), GFP_KERNEL); + if (!card) { + printk(KERN_CRIT hfc_DRIVER_PREFIX +@@ -1307,10 +1400,48 @@ + } + + memset(card, 0x00, sizeof(struct hfc_card)); +- card->cardnum = cardnum; + card->pcidev = pci_dev; ++#endif /* !__FreeBSD__ */ ++ card->cardnum = cardnum; + spin_lock_init(&card->lock); + ++#if defined(__FreeBSD__) ++ /* allocate IO resource */ ++ card->mem_rid = PCIR_BAR(1); ++ card->mem_res = bus_alloc_resource_any(card->pcidev->dev, SYS_RES_MEMORY, &card->mem_rid, RF_ACTIVE); ++ if (card->mem_res == NULL) { ++ device_printf(dev, "Can't allocate memory resource\n"); ++ err = -ENXIO; ++ goto err_pci_request_regions; ++ } ++ ++ /* enable bus mastering */ ++ pci_enable_busmaster(dev); ++ ++ /* allocate DMA memory */ ++ err = dahdi_dma_allocate(card->pcidev->dev, hfc_FIFO_SIZE, &card->dma_tag, &card->dma_map, ++ (void **) &card->fifos, &card->dma_addr); ++ if (err) ++ goto err_alloc_fifo; ++ ++ /* setup interrupt */ ++ card->irq_res = bus_alloc_resource_any( ++ card->pcidev->dev, SYS_RES_IRQ, &card->irq_rid, RF_SHAREABLE | RF_ACTIVE); ++ if (card->irq_res == NULL) { ++ device_printf(card->pcidev->dev, "Can't allocate irq resource\n"); ++ err = -ENXIO; ++ goto err_request_irq; ++ } ++ ++ err = bus_setup_intr( ++ card->pcidev->dev, card->irq_res, INTR_TYPE_CLK | INTR_MPSAFE, ++ hfc_interrupt, NULL, card, &card->irq_handle); ++ if (err) { ++ device_printf(card->pcidev->dev, "Can't setup interrupt handler (error %d)\n", err); ++ err = -ENXIO; ++ goto err_request_irq; ++ } ++#else + pci_set_drvdata(pci_dev, card); + + err = pci_enable_device(pci_dev); +@@ -1403,6 +1534,7 @@ + card->cardnum); + goto err_request_irq; + } ++#endif /* !__FreeBSD__ */ + + card->nt_mode = FALSE; + +@@ -1419,7 +1551,7 @@ + */ + card->chans[D].card = card; + card->chans[D].name = "D"; +- card->chans[D].status = free; ++ card->chans[D].status = chan_free; + card->chans[D].number = D; + spin_lock_init(&card->chans[D].lock); + +@@ -1460,7 +1592,7 @@ + */ + card->chans[B1].card = card; + card->chans[B1].name = "B1"; +- card->chans[B1].status = free; ++ card->chans[B1].status = chan_free; + card->chans[B1].number = B1; + card->chans[B1].protocol = 0; + spin_lock_init(&card->chans[B1].lock); +@@ -1502,7 +1634,7 @@ + */ + card->chans[B2].card = card; + card->chans[B2].name = "B2"; +- card->chans[B2].status = free; ++ card->chans[B2].status = chan_free; + card->chans[B2].number = B2; + card->chans[B2].protocol = 0; + spin_lock_init(&card->chans[B2].lock); +@@ -1555,14 +1687,17 @@ + hfc_zap_initialize(zthfc); + card->ztdev = zthfc; + ++#if !defined(__FreeBSD__) + snprintf(card->proc_dir_name, + sizeof(card->proc_dir_name), + "%d", card->cardnum); + card->proc_dir = proc_mkdir(card->proc_dir_name, hfc_proc_zaphfc_dir); + SET_PROC_DIRENTRY_OWNER(card->proc_dir); ++#endif /* !__FreeBSD__ */ + + hfc_resetCard(card); + ++#if !defined(__FreeBSD__) + printk(KERN_INFO hfc_DRIVER_PREFIX + "card %d configured for %s mode at mem %#lx (0x%p) IRQ %u\n", + card->cardnum, +@@ -1570,28 +1705,103 @@ + card->io_bus_mem, + card->io_mem, + card->pcidev->irq); ++#endif /* !__FreeBSD__ */ + + cardnum++; + + return 0; + + err_request_irq: ++#if !defined(__FreeBSD__) + pci_free_consistent(pci_dev, hfc_FIFO_SIZE, + card->fifo_mem, card->fifo_bus_mem); ++#endif + err_alloc_fifo: ++#if !defined(__FreeBSD__) + iounmap(card->io_mem); + err_ioremap: + err_noiobase: + err_noirq: + pci_release_regions(pci_dev); ++#endif + err_pci_request_regions: ++#if defined(__FreeBSD__) ++ hfc_release_resources(card); ++#else + err_pci_set_dma_mask: + err_pci_enable_device: + kfree(card); + err_alloc_hfccard: ++#endif + return err; + } + ++#if defined(__FreeBSD__) ++SYSCTL_NODE(_dahdi, OID_AUTO, wcb1xxp, CTLFLAG_RW, 0, "DAHDI wcb1xxp"); ++#define MODULE_PARAM_PREFIX "dahdi.wcb1xxp" ++#define MODULE_PARAM_PARENT _dahdi_wcb1xxp ++ ++static int ++wcb1xxp_device_probe(device_t dev) ++{ ++ struct pci_device_id *id; ++ ++ id = dahdi_pci_device_id_lookup(dev, hfc_pci_ids); ++ if (id == NULL) ++ return (ENXIO); ++ ++ /* found device */ ++ device_printf(dev, "vendor=%x device=%x subvendor=%x\n", ++ id->vendor, id->device, id->subvendor); ++ device_set_desc(dev, "CCD HFC-S"); ++ return (0); ++} ++ ++static int ++wcb1xxp_device_attach(device_t dev) ++{ ++ int res; ++ struct pci_device_id *id; ++ ++ id = dahdi_pci_device_id_lookup(dev, hfc_pci_ids); ++ if (id == NULL) ++ return (ENXIO); ++ ++ res = hfc_probe(dev); ++ return (-res); ++} ++ ++static int ++wcb1xxp_device_detach(device_t dev) ++{ ++ struct hfc_card *card = device_get_softc(dev); ++ ++ hfc_softreset(card); ++ dahdi_unregister(&card->ztdev->span); ++ hfc_release_resources(card); ++ ++ return (0); ++} ++ ++static device_method_t wcb1xxp_methods[] = { ++ DEVMETHOD(device_probe, wcb1xxp_device_probe), ++ DEVMETHOD(device_attach, wcb1xxp_device_attach), ++ DEVMETHOD(device_detach, wcb1xxp_device_detach), ++ { 0, 0 } ++}; ++ ++static driver_t wcb1xxp_pci_driver = { ++ "wcb1xxp", ++ wcb1xxp_methods, ++ sizeof(struct hfc_card) ++}; ++ ++static devclass_t wcb1xxp_devclass; ++ ++DAHDI_DRIVER_MODULE(wcb1xxp, pci, wcb1xxp_pci_driver, wcb1xxp_devclass, 0, 0); ++MODULE_DEPEND(wcb1xxp, pci, 1, 1, 1); ++MODULE_DEPEND(wcb1xxp, dahdi, 1, 1, 1); ++#else + static void __devexit hfc_remove(struct pci_dev *pci_dev) + { + struct hfc_card *card = pci_get_drvdata(pci_dev); +@@ -1671,8 +1881,6 @@ + + module_exit(hfc_module_exit); + +-#endif +- + MODULE_DESCRIPTION(hfc_DRIVER_DESCR); + MODULE_AUTHOR("Jens Wilke <jw_vzaphfc@headissue.com>, " + "Daniele (Vihai) Orlandi <daniele@orlandi.com>, " +@@ -1681,15 +1889,18 @@ + #ifdef MODULE_LICENSE + MODULE_LICENSE("GPL"); + #endif ++#endif /* !__FreeBSD__ */ + + + module_param(modes, int, 0444); + ++#if !defined(__FreeBSD__) + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 10) + module_param_array(nt_modes, int, &nt_modes_count, 0444); + #else + module_param_array(nt_modes, int, nt_modes_count, 0444); + #endif ++#endif /* !__FreeBSD__ */ + + module_param(force_l1_up, int, 0444); + #ifdef DEBUG +diff -ruN freebsd/drivers/dahdi/zaphfc.orig/fifo.c freebsd/drivers/dahdi/zaphfc/fifo.c +--- freebsd/drivers/dahdi/zaphfc.orig/fifo.c 2010-09-01 00:55:30.000000000 +0700 ++++ freebsd/drivers/dahdi/zaphfc/fifo.c 2010-09-01 01:09:07.000000000 +0700 +@@ -13,7 +13,9 @@ + * + */ + ++#if !defined(__FreeBSD__) + #include <linux/kernel.h> ++#endif + + #include <dahdi/kernel.h> + +@@ -36,7 +38,7 @@ + chan->z_base + z_start, + bytes_to_boundary); + +- memcpy(data + bytes_to_boundary, ++ memcpy((char *) data + bytes_to_boundary, + chan->fifo_base, + size - bytes_to_boundary); + } +@@ -60,7 +62,7 @@ + bytes_to_boundary); + + memcpy(chan->fifo_base, +- data + bytes_to_boundary, ++ (char *) data + bytes_to_boundary, + size - bytes_to_boundary); + } + } +diff -ruN freebsd/drivers/dahdi/zaphfc.orig/fifo.h freebsd/drivers/dahdi/zaphfc/fifo.h +--- freebsd/drivers/dahdi/zaphfc.orig/fifo.h 2010-09-01 00:55:30.000000000 +0700 ++++ freebsd/drivers/dahdi/zaphfc/fifo.h 2010-07-07 04:24:55.000000000 +0700 +@@ -21,22 +21,22 @@ + + static inline u16 *Z1_F1(struct hfc_chan_simplex *chan) + { +- return chan->z1_base + (*chan->f1 * 4); ++ return (u16 *) (chan->z1_base + (*chan->f1 * 4)); + } + + static inline u16 *Z2_F1(struct hfc_chan_simplex *chan) + { +- return chan->z2_base + (*chan->f1 * 4); ++ return (u16 *) (chan->z2_base + (*chan->f1 * 4)); + } + + static inline u16 *Z1_F2(struct hfc_chan_simplex *chan) + { +- return chan->z1_base + (*chan->f2 * 4); ++ return (u16 *) (chan->z1_base + (*chan->f2 * 4)); + } + + static inline u16 *Z2_F2(struct hfc_chan_simplex *chan) + { +- return chan->z2_base + (*chan->f2 * 4); ++ return (u16 *) (chan->z2_base + (*chan->f2 * 4)); + } + + static inline u16 Z_inc(struct hfc_chan_simplex *chan, u16 z, u16 inc) +diff -ruN freebsd/drivers/dahdi/zaphfc.orig/zaphfc.h freebsd/drivers/dahdi/zaphfc/zaphfc.h +--- freebsd/drivers/dahdi/zaphfc.orig/zaphfc.h 2010-09-01 00:55:30.000000000 +0700 ++++ freebsd/drivers/dahdi/zaphfc/zaphfc.h 2010-08-31 23:57:30.000000000 +0700 +@@ -24,7 +24,12 @@ + #ifndef _HFC_ZAPHFC_H + #define _HFC_ZAPHFC_H + ++#if defined(__FreeBSD__) ++#include <sys/rman.h> ++#include <machine/bus.h> ++#else + #include <asm/io.h> ++#endif + + #define hfc_DRIVER_NAME "vzaphfc" + #define hfc_DRIVER_PREFIX hfc_DRIVER_NAME ": " +@@ -273,9 +278,9 @@ + int ugly_framebuf_size; + u16 ugly_framebuf_off; + +- void *z1_base, *z2_base; ++ char *z1_base, *z2_base; + void *fifo_base; +- void *z_base; ++ char *z_base; + u16 z_min; + u16 z_max; + u16 fifo_size; +@@ -293,7 +298,7 @@ + }; + + enum hfc_chan_status { +- free, ++ chan_free, + open_framed, + open_voice, + sniff_aux, +@@ -330,12 +335,27 @@ + struct proc_dir_entry *proc_fifos; + struct proc_dir_entry *proc_bufs; + ++#if defined(__FreeBSD__) ++ struct pci_dev _dev; ++ ++ struct resource *mem_res; /* resource for I/O range */ ++ int mem_rid; ++ ++ struct resource *irq_res; /* resource for irq */ ++ int irq_rid; ++ void *irq_handle; ++ ++ uint32_t dma_addr; ++ bus_dma_tag_t dma_tag; ++ bus_dmamap_t dma_map; ++#else + unsigned long io_bus_mem; + void __iomem *io_mem; + + dma_addr_t fifo_bus_mem; ++#endif /* !__FreeBSD__ */ + void *fifo_mem; +- void *fifos; ++ char *fifos; + + int nt_mode; + int sync_loss_reported; +@@ -403,12 +423,24 @@ + + static inline u8 hfc_inb(struct hfc_card *card, int offset) + { ++#if defined(__FreeBSD__) ++ return bus_space_read_1( ++ rman_get_bustag(card->mem_res), rman_get_bushandle(card->mem_res), ++ offset); ++#else + return readb(card->io_mem + offset); ++#endif + } + + static inline void hfc_outb(struct hfc_card *card, int offset, u8 value) + { ++#if defined(__FreeBSD__) ++ bus_space_write_1( ++ rman_get_bustag(card->mem_res), rman_get_bushandle(card->mem_res), ++ offset, value); ++#else + writeb(value, card->io_mem + offset); ++#endif + } + + #endif +diff -ruN freebsd/freebsd/wcb1xxp.orig/Makefile freebsd/freebsd/wcb1xxp/Makefile +--- freebsd/freebsd/wcb1xxp.orig/Makefile 1970-01-01 07:00:00.000000000 +0700 ++++ freebsd/freebsd/wcb1xxp/Makefile 2010-09-01 01:00:49.000000000 +0700 +@@ -0,0 +1,9 @@ ++# $Id: Makefile 7432 2009-10-28 21:34:15Z fjoe $ ++ ++.PATH: ${.CURDIR}/../../drivers/dahdi/zaphfc ++ ++KMOD= wcb1xxp ++SRCS= base.c fifo.c ++SRCS+= device_if.h bus_if.h pci_if.h ++ ++.include <bsd.kmod.mk> diff --git a/misc/dahdi-kmod/pkg-plist b/misc/dahdi-kmod/pkg-plist index 8cec3807c4b1..13f5f6ee148b 100644 --- a/misc/dahdi-kmod/pkg-plist +++ b/misc/dahdi-kmod/pkg-plist @@ -14,6 +14,7 @@ lib/dahdi/dahdi_dynamic_ethmf.ko lib/dahdi/dahdi_dynamic_loc.ko lib/dahdi/dahdi_echocan_jpah.ko lib/dahdi/dahdi_echocan_kb1.ko +lib/dahdi/dahdi_echocan_oslec.ko lib/dahdi/dahdi_echocan_mg2.ko lib/dahdi/dahdi_echocan_sec.ko lib/dahdi/dahdi_echocan_sec2.ko @@ -22,6 +23,7 @@ lib/dahdi/dahdi_voicebus.ko %%X86%%lib/dahdi/dahdi_vpmadt032_loader.ko lib/dahdi/linker.hints lib/dahdi/ng_dahdi_netdev.ko +lib/dahdi/wcb1xxp.ko lib/dahdi/wcb4xxp.ko lib/dahdi/wcfxo.ko lib/dahdi/wct4xxp.ko diff --git a/misc/dahdi/Makefile b/misc/dahdi/Makefile index 992e22e94519..2828275726f0 100644 --- a/misc/dahdi/Makefile +++ b/misc/dahdi/Makefile @@ -12,6 +12,10 @@ CATEGORIES= misc kld MASTER_SITES= ${MASTER_SITE_LOCAL} MASTER_SITE_SUBDIR= fjoe DISTNAME= ${PORTNAME}-freebsd-complete-${DAHDI_VERSION}+${DAHDI_TOOLS_VERSION} +DISTFILES= ${DISTNAME}${EXTRACT_SUFX}\ + oslec-linux-${OSLEC_VERSION}${EXTRACT_SUFX}\ + zaphfc-${ZAPHFC_VERSION}${EXTRACT_SUFX} +EXTRA_PATCHES= ${WRKDIR}/zaphfc-${ZAPHFC_VERSION} MAINTAINER= fjoe@FreeBSD.org COMMENT= Digium/Asterisk Hardware Device Interface @@ -19,8 +23,10 @@ COMMENT= Digium/Asterisk Hardware Device Interface BUILD_DEPENDS= gmake:${PORTSDIR}/devel/gmake LIB_DEPENDS= newt.52:${PORTSDIR}/devel/newt -DAHDI_VERSION= 2.4.0-rc3 +DAHDI_VERSION= 2.4.0-rc4 DAHDI_TOOLS_VERSION= 2.4.0-rc1 +OSLEC_VERSION= 2.6.35.4 +ZAPHFC_VERSION= r5 NO_PACKAGE= Should be in sync with the kernel to work correctly GNU_CONFIGURE= yes @@ -28,6 +34,7 @@ CONFIGURE_ARGS= --with-dahdi=../freebsd --sysconfdir=${PREFIX}/etc --with-newt=$ CONFIGURE_ENV= WGET=/usr/bin/fetch USE_LDCONFIG= yes USE_RC_SUBR= dahdi +MAKE_ARGS= ADDITIONAL_DRIVERS="wcb1xxp" ONLY_FOR_ARCHS= i386 amd64 sparc64 CONFLICTS= zaptel-[0-9]* @@ -58,6 +65,10 @@ pre-everything:: ${FALSE}; \ fi +post-extract: + @${LN} -s ../../../linux-${OSLEC_VERSION}/drivers/staging ${WRKSRC}/freebsd/drivers + @${REINPLACE_CMD} -E -e 's,(new|old)/,freebsd/,g' ${WRKDIR}/zaphfc-${ZAPHFC_VERSION} + post-patch: @${REINPLACE_CMD} -e 's,/etc,${PREFIX}/etc,g'\ ${WRKSRC}/tools/dahdi_cfg.c ${WRKSRC}/tools/fxotune.c\ diff --git a/misc/dahdi/distinfo b/misc/dahdi/distinfo index 4fd504636928..54e4b9788cd5 100644 --- a/misc/dahdi/distinfo +++ b/misc/dahdi/distinfo @@ -1,3 +1,9 @@ -MD5 (dahdi-freebsd-complete-2.4.0-rc3+2.4.0-rc1.tar.gz) = 72f236f905c6f8ac66e3bb4d781cffaa -SHA256 (dahdi-freebsd-complete-2.4.0-rc3+2.4.0-rc1.tar.gz) = fb31f1ca76fa89568ba9590a4d65f7e26ab69e45e09587bd0e3b2a97b93ade60 -SIZE (dahdi-freebsd-complete-2.4.0-rc3+2.4.0-rc1.tar.gz) = 2048903 +MD5 (dahdi-freebsd-complete-2.4.0-rc4+2.4.0-rc1.tar.gz) = 4246fd70cb196cbfd6eba16a9ce0e434 +SHA256 (dahdi-freebsd-complete-2.4.0-rc4+2.4.0-rc1.tar.gz) = 17530a885626ded8fb8d8dd6f04dbf3366e90bceda5a6a02a948d49a29ef8b4c +SIZE (dahdi-freebsd-complete-2.4.0-rc4+2.4.0-rc1.tar.gz) = 2049406 +MD5 (oslec-linux-2.6.35.4.tar.gz) = e63e8e7cc4d7338bcb8e526594a34495 +SHA256 (oslec-linux-2.6.35.4.tar.gz) = 01cfaa1ca64056c822d1a3ebf4f7b3c81127cd7b308ad5b0738ff4eb2026e261 +SIZE (oslec-linux-2.6.35.4.tar.gz) = 12057 +MD5 (zaphfc-r5.tar.gz) = 5fbc6110c01b60e6795b5e8424bb4790 +SHA256 (zaphfc-r5.tar.gz) = 7e809b62dcc2bd3caf2e5a882390051b881eb08d37fea1733d7fb55e80bc6756 +SIZE (zaphfc-r5.tar.gz) = 15639 diff --git a/misc/dahdi/files/patch-bchan b/misc/dahdi/files/patch-bchan index 897ab738bd79..4aa35a8b8163 100644 --- a/misc/dahdi/files/patch-bchan +++ b/misc/dahdi/files/patch-bchan @@ -1,3 +1,8 @@ +# Translate the D channels to a standard channel data. +# The HFC chipset provides us the D channel as data, but +# Zaptel expects it as a standard channel with 1000 samples +# per second. + Index: freebsd/include/dahdi/dahdi_config.h =================================================================== --- freebsd/include/dahdi/dahdi_config.h (revision 8781) diff --git a/misc/dahdi/files/patch-freebsd-freebsd-Makefile b/misc/dahdi/files/patch-freebsd-freebsd-Makefile new file mode 100644 index 000000000000..719fc111e697 --- /dev/null +++ b/misc/dahdi/files/patch-freebsd-freebsd-Makefile @@ -0,0 +1,12 @@ +--- freebsd/freebsd/Makefile.orig 2010-09-01 01:13:18.000000000 +0700 ++++ freebsd/freebsd/Makefile 2010-09-01 01:13:33.000000000 +0700 +@@ -51,6 +51,9 @@ + wctc4xxp\ + dahdi-fw-tc400m.bin + ++# Additional drivers ++SUBDIR+= ${ADDITIONAL_DRIVERS} ++ + .if ${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "amd64" + _dahdi_vpmadt032_loader= dahdi_vpmadt032_loader + .endif diff --git a/misc/dahdi/files/patch-oslec b/misc/dahdi/files/patch-oslec new file mode 100644 index 000000000000..56eb68b89584 --- /dev/null +++ b/misc/dahdi/files/patch-oslec @@ -0,0 +1,29 @@ +diff -ru freebsd/drivers/staging/echo/echo.c.orig freebsd/drivers/staging/echo/echo.c.orig +--- freebsd/drivers/staging/echo/echo.c.orig 2010-08-27 06:47:12.000000000 +0700 ++++ freebsd/drivers/staging/echo/echo.c 2010-08-31 14:45:48.000000000 +0700 +@@ -102,9 +102,15 @@ + Mark, Pawel, and Pavel. + */ + ++#if defined(__FreeBSD__) ++#include <sys/types.h> ++#include <sys/libkern.h> ++#include <dahdi/compat/bsd.h> ++#else + #include <linux/kernel.h> + #include <linux/module.h> + #include <linux/slab.h> ++#endif /* !__FreeBSD__ */ + + #include "echo.h" + +@@ -656,7 +662,9 @@ + } + EXPORT_SYMBOL_GPL(oslec_hpf_tx); + ++#if !defined(__FreeBSD__) + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("David Rowe"); + MODULE_DESCRIPTION("Open Source Line Echo Canceller"); + MODULE_VERSION("0.3.0"); ++#endif /* !__FreeBSD__ */ diff --git a/misc/dahdi/files/patch-zaphfc b/misc/dahdi/files/patch-zaphfc new file mode 100644 index 000000000000..68fa04470388 --- /dev/null +++ b/misc/dahdi/files/patch-zaphfc @@ -0,0 +1,744 @@ +diff -ruN freebsd/drivers/dahdi/zaphfc.orig/base.c freebsd/drivers/dahdi/zaphfc/base.c +--- freebsd/drivers/dahdi/zaphfc.orig/base.c 2010-09-01 00:55:30.000000000 +0700 ++++ freebsd/drivers/dahdi/zaphfc/base.c 2010-09-01 03:03:20.000000000 +0700 +@@ -23,6 +23,50 @@ + * Please read the README file for important infos. + */ + ++#if defined(__FreeBSD__) ++#include <sys/types.h> ++#include <sys/bus.h> ++#include <sys/module.h> ++#include <dev/pci/pcireg.h> ++#include <dev/pci/pcivar.h> ++ ++#define PCI_VENDOR_ID_CCD 0x1397 ++ ++#define PCI_DEVICE_ID_CCD_2BD0 0x2bd0 ++#define PCI_DEVICE_ID_CCD_B000 0xb000 ++#define PCI_DEVICE_ID_CCD_B006 0xb006 ++#define PCI_DEVICE_ID_CCD_B007 0xb007 ++#define PCI_DEVICE_ID_CCD_B008 0xb008 ++#define PCI_DEVICE_ID_CCD_B009 0xb009 ++#define PCI_DEVICE_ID_CCD_B00A 0xb00a ++#define PCI_DEVICE_ID_CCD_B00B 0xb00b ++#define PCI_DEVICE_ID_CCD_B00C 0xb00c ++#define PCI_DEVICE_ID_CCD_B100 0xb100 ++ ++#define PCI_VENDOR_ID_ABOCOM 0x13D1 ++#define PCI_DEVICE_ID_ABOCOM_2BD1 0x2BD1 ++ ++#define PCI_VENDOR_ID_ANIGMA 0x1051 ++#define PCI_DEVICE_ID_ANIGMA_MC145575 0x0100 ++ ++#define PCI_VENDOR_ID_ASUSTEK 0x1043 ++#define PCI_DEVICE_ID_ASUSTEK_0675 0x0675 ++ ++#define PCI_VENDOR_ID_BERKOM 0x0871 ++#define PCI_DEVICE_ID_BERKOM_A1T 0xffa1 ++#define PCI_DEVICE_ID_BERKOM_T_CONCEPT 0xffa2 ++ ++#define PCI_VENDOR_ID_DIGI 0x114f ++#define PCI_DEVICE_ID_DIGI_DF_M_IOM2_E 0x0070 ++#define PCI_DEVICE_ID_DIGI_DF_M_E 0x0071 ++#define PCI_DEVICE_ID_DIGI_DF_M_IOM2_A 0x0072 ++#define PCI_DEVICE_ID_DIGI_DF_M_A 0x0073 ++ ++#define PCI_VENDOR_ID_ZOLTRIX 0x15b0 ++#define PCI_DEVICE_ID_ZOLTRIX_2BD0 0x2bd0 ++ ++#define set_current_state(x) ++#else /* !__FreeBSD__ */ + #include <linux/spinlock.h> + #include <linux/init.h> + #include <linux/pci.h> +@@ -34,14 +78,13 @@ + #include <linux/delay.h> + #include <linux/proc_fs.h> + #include <linux/if_arp.h> ++#endif /* !__FreeBSD__ */ + + #include <dahdi/kernel.h> + + #include "zaphfc.h" + #include "fifo.h" + +-#if CONFIG_PCI +- + #define DAHDI_B1 0 + #define DAHDI_B2 1 + #define DAHDI_D 2 +@@ -57,7 +100,9 @@ + static int nt_modes[hfc_MAX_BOARDS]; + static int nt_modes_count; + static int force_l1_up; ++#if !defined(__FreeBSD__) + static struct proc_dir_entry *hfc_proc_zaphfc_dir; ++#endif + + #ifdef DEBUG + int debug_level; +@@ -122,6 +167,31 @@ + {0,} + }; + ++#if defined(__FreeBSD__) ++static void ++hfc_release_resources(struct hfc_card *card) ++{ ++ /* disconnect the interrupt handler */ ++ if (card->irq_handle != NULL) { ++ bus_teardown_intr(card->pcidev->dev, card->irq_res, card->irq_handle); ++ card->irq_handle = NULL; ++ } ++ ++ if (card->irq_res != NULL) { ++ bus_release_resource(card->pcidev->dev, SYS_RES_IRQ, card->irq_rid, card->irq_res); ++ card->irq_res = NULL; ++ } ++ ++ /* release DMA resources */ ++ dahdi_dma_free(&card->dma_tag, &card->dma_map, (void **) &card->fifos, &card->dma_addr); ++ ++ /* release I/O range */ ++ if (card->mem_res != NULL) { ++ bus_release_resource(card->pcidev->dev, SYS_RES_MEMORY, card->mem_rid, card->mem_res); ++ card->mem_res = NULL; ++ } ++} ++#else + MODULE_DEVICE_TABLE(pci, hfc_pci_ids); + + static int __devinit hfc_probe(struct pci_dev *dev +@@ -134,6 +204,7 @@ + .probe = hfc_probe, + .remove = hfc_remove, + }; ++#endif /* !__FreeBSD__ */ + + /****************************************** + * HW routines +@@ -418,7 +489,7 @@ + + switch (chan->number) { + case D: +- if (chan->status != free && ++ if (chan->status != chan_free && + chan->status != open_framed) { + spin_unlock(&chan->lock); + return -EBUSY; +@@ -428,7 +499,7 @@ + + case B1: + case B2: +- if (chan->status != free) { ++ if (chan->status != chan_free) { + spin_unlock(&chan->lock); + return -EBUSY; + } +@@ -437,7 +508,7 @@ + } + + chan->open_by_zaptel = TRUE; +- try_module_get(THIS_MODULE); ++ (void) try_module_get(THIS_MODULE); + spin_unlock(&chan->lock); + + switch (chan->number) { +@@ -509,12 +580,12 @@ + + spin_lock(&chan->lock); + +- if (chan->status == free) { ++ if (chan->status == chan_free) { + spin_unlock(&chan->lock); + return -EINVAL; + } + +- chan->status = free; ++ chan->status = chan_free; + chan->open_by_zaptel = FALSE; + + spin_unlock(&chan->lock); +@@ -538,8 +609,8 @@ + break; + } + +- if (card->chans[B1].status == free && +- card->chans[B2].status == free) ++ if (card->chans[B1].status == chan_free && ++ card->chans[B2].status == chan_free) + card->regs.m2 &= ~hfc_M2_PROC_TRANS; + + hfc_outb(card, hfc_INT_M2, card->regs.m2); +@@ -591,7 +662,7 @@ + + static int hfc_zap_startup(struct dahdi_span *span) + { +- struct dahdi_hfc *zthfc = span->pvt; ++ struct dahdi_hfc *zthfc = container_of(span, struct dahdi_hfc, span); + struct hfc_card *hfctmp = zthfc->card; + int alreadyrunning; + +@@ -642,6 +713,20 @@ + return 0; + } + ++static const struct dahdi_span_ops hfc_zap_span_ops = { ++ .owner = THIS_MODULE, ++ .startup = hfc_zap_startup, ++ .shutdown = hfc_zap_shutdown, ++ .rbsbits = hfc_zap_rbsbits, ++ .maint = hfc_zap_maint, ++ .open = hfc_zap_open, ++ .close = hfc_zap_close, ++ .spanconfig = hfc_zap_spanconfig, ++ .chanconfig = hfc_zap_chanconfig, ++ .ioctl = hfc_zap_ioctl, ++ .hdlc_hard_xmit = hfc_hdlc_hard_xmit, ++}; ++ + static int hfc_zap_initialize(struct dahdi_hfc *hfccard) + { + struct hfc_card *hfctmp = hfccard->card; +@@ -655,23 +740,14 @@ + hfctmp->nt_mode ? "NT" : "TE"); + hfccard->span.spantype = hfctmp->nt_mode ? "NT" : "TE"; + hfccard->span.manufacturer = "Cologne Chips"; +- hfccard->span.spanconfig = hfc_zap_spanconfig; +- hfccard->span.chanconfig = hfc_zap_chanconfig; +- hfccard->span.startup = hfc_zap_startup; +- hfccard->span.shutdown = hfc_zap_shutdown; +- hfccard->span.maint = hfc_zap_maint; +- hfccard->span.rbsbits = hfc_zap_rbsbits; +- hfccard->span.open = hfc_zap_open; +- hfccard->span.close = hfc_zap_close; +- hfccard->span.ioctl = hfc_zap_ioctl; +- hfccard->span.hdlc_hard_xmit = hfc_hdlc_hard_xmit; ++ hfccard->span.ops = &hfc_zap_span_ops; + hfccard->span.flags = 0; +- hfccard->span.irq = hfctmp->pcidev->irq; ++ hfccard->span.irq = dahdi_pci_get_irq(hfctmp->pcidev); + dahdi_copy_string(hfccard->span.devicetype, "HFC-S PCI-A ISDN", + sizeof(hfccard->span.devicetype)); + sprintf(hfccard->span.location, "PCI Bus %02d Slot %02d", +- hfctmp->pcidev->bus->number, +- PCI_SLOT(hfctmp->pcidev->devfn) + 1); ++ dahdi_pci_get_bus(hfctmp->pcidev), ++ dahdi_pci_get_slot(hfctmp->pcidev)); + hfccard->span.chans = hfccard->_chans; + hfccard->span.channels = 3; + for (i = 0; i < hfccard->span.channels; i++) +@@ -680,7 +756,6 @@ + hfccard->span.linecompat = DAHDI_CONFIG_AMI | DAHDI_CONFIG_CCS; + hfccard->span.offset = 0; + init_waitqueue_head(&hfccard->span.maintq); +- hfccard->span.pvt = hfccard; + + for (i = 0; i < hfccard->span.channels; i++) { + memset(&hfccard->chans[i], 0x0, sizeof(struct dahdi_chan)); +@@ -760,22 +835,20 @@ + static void hfc_frame_arrived(struct hfc_chan_duplex *chan); + static void hfc_handle_voice(struct hfc_card *card); + +-#if (KERNEL_VERSION(2, 6, 24) < LINUX_VERSION_CODE) +-static irqreturn_t hfc_interrupt(int irq, void *dev_id) +-#else +-static irqreturn_t hfc_interrupt(int irq, void *dev_id, struct pt_regs *regs) +-#endif ++DAHDI_IRQ_HANDLER(hfc_interrupt) + { + struct hfc_card *card = dev_id; + unsigned long flags; + u8 status, s1, s2; + ++#if !defined(__FreeBSD__) + if (!card) { + printk(KERN_CRIT hfc_DRIVER_PREFIX + "spurious interrupt (IRQ %d)\n", + irq); + return IRQ_NONE; + } ++#endif /* !__FreeBSD__ */ + + spin_lock_irqsave(&card->lock, flags); + status = hfc_inb(card, hfc_STATUS); +@@ -1179,7 +1252,9 @@ + { + struct hfc_card *card = chan->card; + int antiloop = 16; ++#if !defined(__FreeBSD__) + struct sk_buff *skb; ++#endif + + while (hfc_fifo_has_frames(&chan->rx) && --antiloop) { + int frame_size = hfc_fifo_get_frame_size(&chan->rx); +@@ -1229,6 +1304,7 @@ + break; + } + ++#if !defined(__FreeBSD__) + skb = dev_alloc_skb(frame_size - 3); + + if (!skb) { +@@ -1254,6 +1330,7 @@ + #else + skb->ip_summed = CHECKSUM_HW; + #endif ++#endif /* !__FreeBSD__ */ + + if (chan->open_by_zaptel) { + card->chans[D].rx.ugly_framebuf_size = frame_size - 1; +@@ -1261,20 +1338,26 @@ + if (hfc_fifo_get_frame(&card->chans[D].rx, + card->chans[D].rx.ugly_framebuf, + frame_size - 1) == -1) { ++#if !defined(__FreeBSD__) + dev_kfree_skb(skb); ++#endif + continue; + } + ++#if !defined(__FreeBSD__) + memcpy(skb_put(skb, frame_size - 3), + card->chans[D].rx.ugly_framebuf, + frame_size - 3); ++#endif + } else { ++#if !defined(__FreeBSD__) + if (hfc_fifo_get_frame(&chan->rx, + skb_put(skb, frame_size - 3), + frame_size - 3) == -1) { + dev_kfree_skb(skb); + continue; + } ++#endif + } + } + +@@ -1289,8 +1372,12 @@ + * Module initialization and cleanup + ******************************************/ + ++#if defined(__FreeBSD__) ++static int hfc_probe(device_t dev) ++#else + static int __devinit hfc_probe(struct pci_dev *pci_dev, + const struct pci_device_id *ent) ++#endif + { + static int cardnum; + int err; +@@ -1298,6 +1385,12 @@ + + struct hfc_card *card = NULL; + struct dahdi_hfc *zthfc = NULL; ++ ++#if defined(__FreeBSD__) ++ card = device_get_softc(dev); ++ card->pcidev = &card->_dev; ++ card->pcidev->dev = dev; ++#else + card = kmalloc(sizeof(struct hfc_card), GFP_KERNEL); + if (!card) { + printk(KERN_CRIT hfc_DRIVER_PREFIX +@@ -1307,10 +1400,48 @@ + } + + memset(card, 0x00, sizeof(struct hfc_card)); +- card->cardnum = cardnum; + card->pcidev = pci_dev; ++#endif /* !__FreeBSD__ */ ++ card->cardnum = cardnum; + spin_lock_init(&card->lock); + ++#if defined(__FreeBSD__) ++ /* allocate IO resource */ ++ card->mem_rid = PCIR_BAR(1); ++ card->mem_res = bus_alloc_resource_any(card->pcidev->dev, SYS_RES_MEMORY, &card->mem_rid, RF_ACTIVE); ++ if (card->mem_res == NULL) { ++ device_printf(dev, "Can't allocate memory resource\n"); ++ err = -ENXIO; ++ goto err_pci_request_regions; ++ } ++ ++ /* enable bus mastering */ ++ pci_enable_busmaster(dev); ++ ++ /* allocate DMA memory */ ++ err = dahdi_dma_allocate(card->pcidev->dev, hfc_FIFO_SIZE, &card->dma_tag, &card->dma_map, ++ (void **) &card->fifos, &card->dma_addr); ++ if (err) ++ goto err_alloc_fifo; ++ ++ /* setup interrupt */ ++ card->irq_res = bus_alloc_resource_any( ++ card->pcidev->dev, SYS_RES_IRQ, &card->irq_rid, RF_SHAREABLE | RF_ACTIVE); ++ if (card->irq_res == NULL) { ++ device_printf(card->pcidev->dev, "Can't allocate irq resource\n"); ++ err = -ENXIO; ++ goto err_request_irq; ++ } ++ ++ err = bus_setup_intr( ++ card->pcidev->dev, card->irq_res, INTR_TYPE_CLK | INTR_MPSAFE, ++ hfc_interrupt, NULL, card, &card->irq_handle); ++ if (err) { ++ device_printf(card->pcidev->dev, "Can't setup interrupt handler (error %d)\n", err); ++ err = -ENXIO; ++ goto err_request_irq; ++ } ++#else + pci_set_drvdata(pci_dev, card); + + err = pci_enable_device(pci_dev); +@@ -1403,6 +1534,7 @@ + card->cardnum); + goto err_request_irq; + } ++#endif /* !__FreeBSD__ */ + + card->nt_mode = FALSE; + +@@ -1419,7 +1551,7 @@ + */ + card->chans[D].card = card; + card->chans[D].name = "D"; +- card->chans[D].status = free; ++ card->chans[D].status = chan_free; + card->chans[D].number = D; + spin_lock_init(&card->chans[D].lock); + +@@ -1460,7 +1592,7 @@ + */ + card->chans[B1].card = card; + card->chans[B1].name = "B1"; +- card->chans[B1].status = free; ++ card->chans[B1].status = chan_free; + card->chans[B1].number = B1; + card->chans[B1].protocol = 0; + spin_lock_init(&card->chans[B1].lock); +@@ -1502,7 +1634,7 @@ + */ + card->chans[B2].card = card; + card->chans[B2].name = "B2"; +- card->chans[B2].status = free; ++ card->chans[B2].status = chan_free; + card->chans[B2].number = B2; + card->chans[B2].protocol = 0; + spin_lock_init(&card->chans[B2].lock); +@@ -1555,14 +1687,17 @@ + hfc_zap_initialize(zthfc); + card->ztdev = zthfc; + ++#if !defined(__FreeBSD__) + snprintf(card->proc_dir_name, + sizeof(card->proc_dir_name), + "%d", card->cardnum); + card->proc_dir = proc_mkdir(card->proc_dir_name, hfc_proc_zaphfc_dir); + SET_PROC_DIRENTRY_OWNER(card->proc_dir); ++#endif /* !__FreeBSD__ */ + + hfc_resetCard(card); + ++#if !defined(__FreeBSD__) + printk(KERN_INFO hfc_DRIVER_PREFIX + "card %d configured for %s mode at mem %#lx (0x%p) IRQ %u\n", + card->cardnum, +@@ -1570,28 +1705,103 @@ + card->io_bus_mem, + card->io_mem, + card->pcidev->irq); ++#endif /* !__FreeBSD__ */ + + cardnum++; + + return 0; + + err_request_irq: ++#if !defined(__FreeBSD__) + pci_free_consistent(pci_dev, hfc_FIFO_SIZE, + card->fifo_mem, card->fifo_bus_mem); ++#endif + err_alloc_fifo: ++#if !defined(__FreeBSD__) + iounmap(card->io_mem); + err_ioremap: + err_noiobase: + err_noirq: + pci_release_regions(pci_dev); ++#endif + err_pci_request_regions: ++#if defined(__FreeBSD__) ++ hfc_release_resources(card); ++#else + err_pci_set_dma_mask: + err_pci_enable_device: + kfree(card); + err_alloc_hfccard: ++#endif + return err; + } + ++#if defined(__FreeBSD__) ++SYSCTL_NODE(_dahdi, OID_AUTO, wcb1xxp, CTLFLAG_RW, 0, "DAHDI wcb1xxp"); ++#define MODULE_PARAM_PREFIX "dahdi.wcb1xxp" ++#define MODULE_PARAM_PARENT _dahdi_wcb1xxp ++ ++static int ++wcb1xxp_device_probe(device_t dev) ++{ ++ struct pci_device_id *id; ++ ++ id = dahdi_pci_device_id_lookup(dev, hfc_pci_ids); ++ if (id == NULL) ++ return (ENXIO); ++ ++ /* found device */ ++ device_printf(dev, "vendor=%x device=%x subvendor=%x\n", ++ id->vendor, id->device, id->subvendor); ++ device_set_desc(dev, "CCD HFC-S"); ++ return (0); ++} ++ ++static int ++wcb1xxp_device_attach(device_t dev) ++{ ++ int res; ++ struct pci_device_id *id; ++ ++ id = dahdi_pci_device_id_lookup(dev, hfc_pci_ids); ++ if (id == NULL) ++ return (ENXIO); ++ ++ res = hfc_probe(dev); ++ return (-res); ++} ++ ++static int ++wcb1xxp_device_detach(device_t dev) ++{ ++ struct hfc_card *card = device_get_softc(dev); ++ ++ hfc_softreset(card); ++ dahdi_unregister(&card->ztdev->span); ++ hfc_release_resources(card); ++ ++ return (0); ++} ++ ++static device_method_t wcb1xxp_methods[] = { ++ DEVMETHOD(device_probe, wcb1xxp_device_probe), ++ DEVMETHOD(device_attach, wcb1xxp_device_attach), ++ DEVMETHOD(device_detach, wcb1xxp_device_detach), ++ { 0, 0 } ++}; ++ ++static driver_t wcb1xxp_pci_driver = { ++ "wcb1xxp", ++ wcb1xxp_methods, ++ sizeof(struct hfc_card) ++}; ++ ++static devclass_t wcb1xxp_devclass; ++ ++DAHDI_DRIVER_MODULE(wcb1xxp, pci, wcb1xxp_pci_driver, wcb1xxp_devclass, 0, 0); ++MODULE_DEPEND(wcb1xxp, pci, 1, 1, 1); ++MODULE_DEPEND(wcb1xxp, dahdi, 1, 1, 1); ++#else + static void __devexit hfc_remove(struct pci_dev *pci_dev) + { + struct hfc_card *card = pci_get_drvdata(pci_dev); +@@ -1671,8 +1881,6 @@ + + module_exit(hfc_module_exit); + +-#endif +- + MODULE_DESCRIPTION(hfc_DRIVER_DESCR); + MODULE_AUTHOR("Jens Wilke <jw_vzaphfc@headissue.com>, " + "Daniele (Vihai) Orlandi <daniele@orlandi.com>, " +@@ -1681,15 +1889,18 @@ + #ifdef MODULE_LICENSE + MODULE_LICENSE("GPL"); + #endif ++#endif /* !__FreeBSD__ */ + + + module_param(modes, int, 0444); + ++#if !defined(__FreeBSD__) + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 10) + module_param_array(nt_modes, int, &nt_modes_count, 0444); + #else + module_param_array(nt_modes, int, nt_modes_count, 0444); + #endif ++#endif /* !__FreeBSD__ */ + + module_param(force_l1_up, int, 0444); + #ifdef DEBUG +diff -ruN freebsd/drivers/dahdi/zaphfc.orig/fifo.c freebsd/drivers/dahdi/zaphfc/fifo.c +--- freebsd/drivers/dahdi/zaphfc.orig/fifo.c 2010-09-01 00:55:30.000000000 +0700 ++++ freebsd/drivers/dahdi/zaphfc/fifo.c 2010-09-01 01:09:07.000000000 +0700 +@@ -13,7 +13,9 @@ + * + */ + ++#if !defined(__FreeBSD__) + #include <linux/kernel.h> ++#endif + + #include <dahdi/kernel.h> + +@@ -36,7 +38,7 @@ + chan->z_base + z_start, + bytes_to_boundary); + +- memcpy(data + bytes_to_boundary, ++ memcpy((char *) data + bytes_to_boundary, + chan->fifo_base, + size - bytes_to_boundary); + } +@@ -60,7 +62,7 @@ + bytes_to_boundary); + + memcpy(chan->fifo_base, +- data + bytes_to_boundary, ++ (char *) data + bytes_to_boundary, + size - bytes_to_boundary); + } + } +diff -ruN freebsd/drivers/dahdi/zaphfc.orig/fifo.h freebsd/drivers/dahdi/zaphfc/fifo.h +--- freebsd/drivers/dahdi/zaphfc.orig/fifo.h 2010-09-01 00:55:30.000000000 +0700 ++++ freebsd/drivers/dahdi/zaphfc/fifo.h 2010-07-07 04:24:55.000000000 +0700 +@@ -21,22 +21,22 @@ + + static inline u16 *Z1_F1(struct hfc_chan_simplex *chan) + { +- return chan->z1_base + (*chan->f1 * 4); ++ return (u16 *) (chan->z1_base + (*chan->f1 * 4)); + } + + static inline u16 *Z2_F1(struct hfc_chan_simplex *chan) + { +- return chan->z2_base + (*chan->f1 * 4); ++ return (u16 *) (chan->z2_base + (*chan->f1 * 4)); + } + + static inline u16 *Z1_F2(struct hfc_chan_simplex *chan) + { +- return chan->z1_base + (*chan->f2 * 4); ++ return (u16 *) (chan->z1_base + (*chan->f2 * 4)); + } + + static inline u16 *Z2_F2(struct hfc_chan_simplex *chan) + { +- return chan->z2_base + (*chan->f2 * 4); ++ return (u16 *) (chan->z2_base + (*chan->f2 * 4)); + } + + static inline u16 Z_inc(struct hfc_chan_simplex *chan, u16 z, u16 inc) +diff -ruN freebsd/drivers/dahdi/zaphfc.orig/zaphfc.h freebsd/drivers/dahdi/zaphfc/zaphfc.h +--- freebsd/drivers/dahdi/zaphfc.orig/zaphfc.h 2010-09-01 00:55:30.000000000 +0700 ++++ freebsd/drivers/dahdi/zaphfc/zaphfc.h 2010-08-31 23:57:30.000000000 +0700 +@@ -24,7 +24,12 @@ + #ifndef _HFC_ZAPHFC_H + #define _HFC_ZAPHFC_H + ++#if defined(__FreeBSD__) ++#include <sys/rman.h> ++#include <machine/bus.h> ++#else + #include <asm/io.h> ++#endif + + #define hfc_DRIVER_NAME "vzaphfc" + #define hfc_DRIVER_PREFIX hfc_DRIVER_NAME ": " +@@ -273,9 +278,9 @@ + int ugly_framebuf_size; + u16 ugly_framebuf_off; + +- void *z1_base, *z2_base; ++ char *z1_base, *z2_base; + void *fifo_base; +- void *z_base; ++ char *z_base; + u16 z_min; + u16 z_max; + u16 fifo_size; +@@ -293,7 +298,7 @@ + }; + + enum hfc_chan_status { +- free, ++ chan_free, + open_framed, + open_voice, + sniff_aux, +@@ -330,12 +335,27 @@ + struct proc_dir_entry *proc_fifos; + struct proc_dir_entry *proc_bufs; + ++#if defined(__FreeBSD__) ++ struct pci_dev _dev; ++ ++ struct resource *mem_res; /* resource for I/O range */ ++ int mem_rid; ++ ++ struct resource *irq_res; /* resource for irq */ ++ int irq_rid; ++ void *irq_handle; ++ ++ uint32_t dma_addr; ++ bus_dma_tag_t dma_tag; ++ bus_dmamap_t dma_map; ++#else + unsigned long io_bus_mem; + void __iomem *io_mem; + + dma_addr_t fifo_bus_mem; ++#endif /* !__FreeBSD__ */ + void *fifo_mem; +- void *fifos; ++ char *fifos; + + int nt_mode; + int sync_loss_reported; +@@ -403,12 +423,24 @@ + + static inline u8 hfc_inb(struct hfc_card *card, int offset) + { ++#if defined(__FreeBSD__) ++ return bus_space_read_1( ++ rman_get_bustag(card->mem_res), rman_get_bushandle(card->mem_res), ++ offset); ++#else + return readb(card->io_mem + offset); ++#endif + } + + static inline void hfc_outb(struct hfc_card *card, int offset, u8 value) + { ++#if defined(__FreeBSD__) ++ bus_space_write_1( ++ rman_get_bustag(card->mem_res), rman_get_bushandle(card->mem_res), ++ offset, value); ++#else + writeb(value, card->io_mem + offset); ++#endif + } + + #endif +diff -ruN freebsd/freebsd/wcb1xxp.orig/Makefile freebsd/freebsd/wcb1xxp/Makefile +--- freebsd/freebsd/wcb1xxp.orig/Makefile 1970-01-01 07:00:00.000000000 +0700 ++++ freebsd/freebsd/wcb1xxp/Makefile 2010-09-01 01:00:49.000000000 +0700 +@@ -0,0 +1,9 @@ ++# $Id: Makefile 7432 2009-10-28 21:34:15Z fjoe $ ++ ++.PATH: ${.CURDIR}/../../drivers/dahdi/zaphfc ++ ++KMOD= wcb1xxp ++SRCS= base.c fifo.c ++SRCS+= device_if.h bus_if.h pci_if.h ++ ++.include <bsd.kmod.mk> diff --git a/misc/dahdi/pkg-plist b/misc/dahdi/pkg-plist index 8cec3807c4b1..13f5f6ee148b 100644 --- a/misc/dahdi/pkg-plist +++ b/misc/dahdi/pkg-plist @@ -14,6 +14,7 @@ lib/dahdi/dahdi_dynamic_ethmf.ko lib/dahdi/dahdi_dynamic_loc.ko lib/dahdi/dahdi_echocan_jpah.ko lib/dahdi/dahdi_echocan_kb1.ko +lib/dahdi/dahdi_echocan_oslec.ko lib/dahdi/dahdi_echocan_mg2.ko lib/dahdi/dahdi_echocan_sec.ko lib/dahdi/dahdi_echocan_sec2.ko @@ -22,6 +23,7 @@ lib/dahdi/dahdi_voicebus.ko %%X86%%lib/dahdi/dahdi_vpmadt032_loader.ko lib/dahdi/linker.hints lib/dahdi/ng_dahdi_netdev.ko +lib/dahdi/wcb1xxp.ko lib/dahdi/wcb4xxp.ko lib/dahdi/wcfxo.ko lib/dahdi/wct4xxp.ko |