Major changes are: - it is no longer possible to unload drivers in use [1] - wctdm params patch is now in upstream - NO_FETCH patch and ADDITIONAL_DRIVERS patches are no longer required PR: 150175 [1] Sponsored by: The FreeBSD Foundation
883 lines
22 KiB
Text
883 lines
22 KiB
Text
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-02 19:19:45.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,6 @@
|
|
}
|
|
|
|
chan->open_by_zaptel = TRUE;
|
|
- try_module_get(THIS_MODULE);
|
|
spin_unlock(&chan->lock);
|
|
|
|
switch (chan->number) {
|
|
@@ -484,7 +554,13 @@
|
|
hfc_outb(card, hfc_SCTRL, card->regs.sctrl);
|
|
hfc_outb(card, hfc_SCTRL_R, card->regs.sctrl_r);
|
|
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_POSTREAD);
|
|
+#endif
|
|
hfc_update_fifo_state(card);
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_PREWRITE);
|
|
+#endif
|
|
|
|
printk(KERN_INFO hfc_DRIVER_PREFIX
|
|
"card %d: "
|
|
@@ -509,12 +585,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 +614,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);
|
|
@@ -548,9 +624,13 @@
|
|
hfc_outb(card, hfc_SCTRL, card->regs.sctrl);
|
|
hfc_outb(card, hfc_SCTRL_R, card->regs.sctrl_r);
|
|
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_POSTREAD);
|
|
+#endif
|
|
hfc_update_fifo_state(card);
|
|
-
|
|
- module_put(THIS_MODULE);
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_PREWRITE);
|
|
+#endif
|
|
|
|
printk(KERN_INFO hfc_DRIVER_PREFIX
|
|
"card %d: "
|
|
@@ -591,7 +671,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 +722,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 +749,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 +765,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 +844,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);
|
|
@@ -832,21 +914,40 @@
|
|
/*
|
|
* D chan RX (bit 5)
|
|
*/
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_POSTREAD);
|
|
+#endif
|
|
hfc_frame_arrived(&card->chans[D]);
|
|
+
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_PREWRITE);
|
|
+#endif
|
|
}
|
|
|
|
if (s1 & hfc_INTS_B1REC) {
|
|
/*
|
|
* B1 chan RX (bit 3)
|
|
*/
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_POSTREAD);
|
|
+#endif
|
|
hfc_frame_arrived(&card->chans[B1]);
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_PREWRITE);
|
|
+#endif
|
|
}
|
|
|
|
if (s1 & hfc_INTS_B2REC) {
|
|
/*
|
|
* B2 chan RX (bit 4)
|
|
*/
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_POSTREAD);
|
|
+#endif
|
|
hfc_frame_arrived(&card->chans[B2]);
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_PREWRITE);
|
|
+#endif
|
|
}
|
|
|
|
if (s1 & hfc_INTS_DTRANS) {
|
|
@@ -940,7 +1041,13 @@
|
|
card->regs.ctmt &= ~hfc_CTMT_TIMER_MASK;
|
|
hfc_outb(card, hfc_CTMT, card->regs.ctmt);
|
|
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_POSTREAD);
|
|
+#endif
|
|
hfc_resume_fifo(card);
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_PREWRITE);
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
@@ -971,11 +1078,17 @@
|
|
hfc_outb(card, hfc_STATES, hfc_STATES_LOAD_STATE | 3);
|
|
}
|
|
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_POSTREAD);
|
|
+#endif
|
|
if (new_state == 3 && card->l1_state != 3)
|
|
hfc_resume_fifo(card);
|
|
|
|
if (new_state != 3 && card->l1_state == 3)
|
|
hfc_suspend_fifo(card);
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_PREWRITE);
|
|
+#endif
|
|
|
|
} else {
|
|
if (new_state == 3) {
|
|
@@ -1015,7 +1128,13 @@
|
|
/*
|
|
* TE has become inactive, disable FIFO
|
|
*/
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_POSTREAD);
|
|
+#endif
|
|
hfc_suspend_fifo(card);
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_PREWRITE);
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
@@ -1040,6 +1159,9 @@
|
|
available_bytes >= DAHDI_CHUNKSIZE + hfc_RX_FIFO_PRELOAD) {
|
|
card->ticks = 0;
|
|
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_POSTREAD);
|
|
+#endif
|
|
if (available_bytes > DAHDI_CHUNKSIZE*2 + hfc_RX_FIFO_PRELOAD) {
|
|
card->late_irqs++;
|
|
/*
|
|
@@ -1064,6 +1186,9 @@
|
|
} else {
|
|
hfc_handle_voice(card);
|
|
}
|
|
+#if defined(__FreeBSD__)
|
|
+ bus_dmamap_sync(card->dma_tag, card->dma_map, BUS_DMASYNC_PREWRITE);
|
|
+#endif
|
|
}
|
|
|
|
card->ticks++;
|
|
@@ -1179,7 +1304,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 +1356,7 @@
|
|
break;
|
|
}
|
|
|
|
+#if !defined(__FreeBSD__)
|
|
skb = dev_alloc_skb(frame_size - 3);
|
|
|
|
if (!skb) {
|
|
@@ -1254,6 +1382,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 +1390,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 +1424,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 +1437,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 +1452,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 +1586,7 @@
|
|
card->cardnum);
|
|
goto err_request_irq;
|
|
}
|
|
+#endif /* !__FreeBSD__ */
|
|
|
|
card->nt_mode = FALSE;
|
|
|
|
@@ -1419,7 +1603,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 +1644,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 +1686,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 +1739,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 +1757,106 @@
|
|
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);
|
|
+
|
|
+ if (dahdi_module_usecount(THIS_MODULE) > 0)
|
|
+ return (EBUSY);
|
|
+
|
|
+ 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);
|
|
+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 +1936,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 +1944,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>
|