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 +#include +#include +#include +#include + +#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 #include #include @@ -34,14 +78,13 @@ #include #include #include +#endif /* !__FreeBSD__ */ #include #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 , " "Daniele (Vihai) Orlandi , " @@ -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 +#endif #include @@ -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 +#include +#else #include +#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