2
* zaphfc.c - Dahdi driver for HFC-S PCI A based ISDN BRI cards
4
* Dahdi rewrite in hardhdlc mode
5
* Jose A. Deniz <odicha@hotmail.com>
7
* Copyright (C) 2009, Jose A. Deniz
8
* Copyright (C) 2006, headiisue GmbH; Jens Wilke
9
* Copyright (C) 2004 Daniele Orlandi
10
* Copyright (C) 2002, 2003, 2004, Junghanns.NET GmbH
12
* Jens Wilke <jw_vzaphfc@headissue.com>
14
* Original author of this code is
15
* Daniele "Vihai" Orlandi <daniele@orlandi.com>
17
* Major rewrite of the driver made by
18
* Klaus-Peter Junghanns <kpj@junghanns.net>
20
* This program is free software and may be modified and
21
* distributed under the terms of the GNU Public License.
23
* Please read the README file for important infos.
26
#include <linux/spinlock.h>
27
#include <linux/init.h>
28
#include <linux/pci.h>
29
#include <linux/interrupt.h>
30
#include <linux/module.h>
31
#include <linux/moduleparam.h>
32
#include <linux/version.h>
33
#include <linux/kernel.h>
34
#include <linux/delay.h>
35
#include <linux/sched.h>
36
#include <linux/proc_fs.h>
37
#include <linux/if_arp.h>
39
#include <dahdi/kernel.h>
58
static int nt_modes[hfc_MAX_BOARDS];
59
static int nt_modes_count;
60
static int force_l1_up;
61
static struct proc_dir_entry *hfc_proc_zaphfc_dir;
74
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
75
#define SET_PROC_DIRENTRY_OWNER(p) do { (p)->owner = THIS_MODULE; } while(0);
77
#define SET_PROC_DIRENTRY_OWNER(p) do { } while(0);
80
static struct pci_device_id hfc_pci_ids[] = {
81
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_2BD0,
82
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
83
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B000,
84
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
85
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B006,
86
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
87
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B007,
88
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
89
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B008,
90
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
91
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B009,
92
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
93
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00A,
94
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
95
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00B,
96
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
97
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00C,
98
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
99
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B100,
100
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
101
{PCI_VENDOR_ID_ABOCOM, PCI_DEVICE_ID_ABOCOM_2BD1,
102
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
103
{PCI_VENDOR_ID_ASUSTEK, PCI_DEVICE_ID_ASUSTEK_0675,
104
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
105
{PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_T_CONCEPT,
106
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
107
{PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_A1T,
108
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
109
{PCI_VENDOR_ID_ANIGMA, PCI_DEVICE_ID_ANIGMA_MC145575,
110
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
111
{PCI_VENDOR_ID_ZOLTRIX, PCI_DEVICE_ID_ZOLTRIX_2BD0,
112
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
113
{PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_E,
114
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
115
{PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_E,
116
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
117
{PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_A,
118
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
119
{PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_A,
120
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
121
{PCI_VENDOR_ID_SITECOM, PCI_DEVICE_ID_SITECOM_3069,
122
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
126
MODULE_DEVICE_TABLE(pci, hfc_pci_ids);
128
static int __devinit hfc_probe(struct pci_dev *dev
129
, const struct pci_device_id *ent);
130
static void __devexit hfc_remove(struct pci_dev *dev);
132
static struct pci_driver hfc_driver = {
133
.name = hfc_DRIVER_NAME,
134
.id_table = hfc_pci_ids,
136
.remove = hfc_remove,
139
/******************************************
141
******************************************/
143
static void hfc_softreset(struct hfc_card *card)
145
printk(KERN_INFO hfc_DRIVER_PREFIX
151
* Softreset procedure. Put it on, wait and off again
153
hfc_outb(card, hfc_CIRM, hfc_CIRM_RESET);
155
hfc_outb(card, hfc_CIRM, 0);
157
set_current_state(TASK_UNINTERRUPTIBLE);
158
schedule_timeout((hfc_RESET_DELAY * HZ) / 1000);
161
static void hfc_resetCard(struct hfc_card *card)
164
hfc_outb(card, hfc_INT_M1, card->regs.m1);
167
hfc_outb(card, hfc_INT_M2, card->regs.m2);
172
hfc_outb(card, hfc_TRM, card->regs.trm);
175
* Select the non-capacitive line mode for the S/T interface
177
card->regs.sctrl = hfc_SCTRL_NONE_CAP;
181
* ST-Bit delay for NT-Mode
183
hfc_outb(card, hfc_CLKDEL, hfc_CLKDEL_NT);
185
card->regs.sctrl |= hfc_SCTRL_MODE_NT;
188
* ST-Bit delay for TE-Mode
190
hfc_outb(card, hfc_CLKDEL, hfc_CLKDEL_TE);
192
card->regs.sctrl |= hfc_SCTRL_MODE_TE;
195
hfc_outb(card, hfc_SCTRL, card->regs.sctrl);
200
card->regs.sctrl_e = hfc_SCTRL_E_AUTO_AWAKE;
201
hfc_outb(card, hfc_SCTRL_E, card->regs.sctrl_e);
204
* No B-channel enabled at startup
206
card->regs.sctrl_r = 0;
207
hfc_outb(card, hfc_SCTRL_R, card->regs.sctrl_r);
212
hfc_outb(card, hfc_MST_MODE, hfc_MST_MODE_MASTER);
215
* Connect internal blocks
218
hfc_CONNECT_B1_HFC_from_ST |
219
hfc_CONNECT_B1_ST_from_HFC |
220
hfc_CONNECT_B1_GCI_from_HFC |
221
hfc_CONNECT_B2_HFC_from_ST |
222
hfc_CONNECT_B2_ST_from_HFC |
223
hfc_CONNECT_B2_GCI_from_HFC;
224
hfc_outb(card, hfc_CONNECT, card->regs.connect);
227
* All bchans are HDLC by default, not useful, actually
228
* since mode is set during open()
230
hfc_outb(card, hfc_CTMT, 0);
235
hfc_outb(card, hfc_CIRM, 0);
238
* Enable D-rx FIFO. At least one FIFO must be enabled (by specs)
240
card->regs.fifo_en = hfc_FIFOEN_DRX;
241
hfc_outb(card, hfc_FIFO_EN, card->regs.fifo_en);
246
* Clear already pending ints
248
hfc_inb(card, hfc_INT_S1);
249
hfc_inb(card, hfc_INT_S2);
254
card->regs.m1 = hfc_INTS_DREC | hfc_INTS_L1STATE | hfc_INTS_TIMER;
255
hfc_outb(card, hfc_INT_M1, card->regs.m1);
257
card->regs.m2 = hfc_M2_IRQ_ENABLE;
258
hfc_outb(card, hfc_INT_M2, card->regs.m2);
261
* Unlocks the states machine
263
hfc_outb(card, hfc_STATES, 0);
266
* There's no need to explicitly activate L1 now.
267
* Activation is managed inside the interrupt routine.
271
static void hfc_update_fifo_state(struct hfc_card *card)
274
* I'm not sure if irqsave is needed but there could be a race
275
* condition since hfc_update_fifo_state could be called from
276
* both the IRQ handler and the *_(open|close) functions
280
spin_lock_irqsave(&card->chans[B1].lock, flags);
281
if (!card->fifo_suspended &&
282
(card->chans[B1].status == open_framed ||
283
card->chans[B1].status == open_voice)) {
285
if (!(card->regs.fifo_en & hfc_FIFOEN_B1RX)) {
286
card->regs.fifo_en |= hfc_FIFOEN_B1RX;
287
hfc_clear_fifo_rx(&card->chans[B1].rx);
290
if (!(card->regs.fifo_en & hfc_FIFOEN_B1TX)) {
291
card->regs.fifo_en |= hfc_FIFOEN_B1TX;
292
hfc_clear_fifo_tx(&card->chans[B1].tx);
295
if (card->regs.fifo_en & hfc_FIFOEN_B1RX)
296
card->regs.fifo_en &= ~hfc_FIFOEN_B1RX;
297
if (card->regs.fifo_en & hfc_FIFOEN_B1TX)
298
card->regs.fifo_en &= ~hfc_FIFOEN_B1TX;
300
spin_unlock_irqrestore(&card->chans[B1].lock, flags);
302
spin_lock_irqsave(&card->chans[B2].lock, flags);
303
if (!card->fifo_suspended &&
304
(card->chans[B2].status == open_framed ||
305
card->chans[B2].status == open_voice ||
306
card->chans[B2].status == sniff_aux)) {
308
if (!(card->regs.fifo_en & hfc_FIFOEN_B2RX)) {
309
card->regs.fifo_en |= hfc_FIFOEN_B2RX;
310
hfc_clear_fifo_rx(&card->chans[B2].rx);
313
if (!(card->regs.fifo_en & hfc_FIFOEN_B2TX)) {
314
card->regs.fifo_en |= hfc_FIFOEN_B2TX;
315
hfc_clear_fifo_tx(&card->chans[B2].tx);
318
if (card->regs.fifo_en & hfc_FIFOEN_B2RX)
319
card->regs.fifo_en &= ~hfc_FIFOEN_B2RX;
320
if (card->regs.fifo_en & hfc_FIFOEN_B2TX)
321
card->regs.fifo_en &= ~hfc_FIFOEN_B2TX;
323
spin_unlock_irqrestore(&card->chans[B2].lock, flags);
325
spin_lock_irqsave(&card->chans[D].lock, flags);
326
if (!card->fifo_suspended &&
327
card->chans[D].status == open_framed) {
329
if (!(card->regs.fifo_en & hfc_FIFOEN_DTX)) {
330
card->regs.fifo_en |= hfc_FIFOEN_DTX;
332
card->chans[D].tx.ugly_framebuf_size = 0;
333
card->chans[D].tx.ugly_framebuf_off = 0;
336
if (card->regs.fifo_en & hfc_FIFOEN_DTX)
337
card->regs.fifo_en &= ~hfc_FIFOEN_DTX;
339
spin_unlock_irqrestore(&card->chans[D].lock, flags);
341
hfc_outb(card, hfc_FIFO_EN, card->regs.fifo_en);
344
static inline void hfc_suspend_fifo(struct hfc_card *card)
346
card->fifo_suspended = TRUE;
348
hfc_update_fifo_state(card);
351
* When L1 goes down D rx receives garbage; it is nice to
352
* clear it to avoid a CRC error on reactivation
353
* udelay is needed because the FIFO deactivation happens
357
hfc_clear_fifo_rx(&card->chans[D].rx);
360
if (debug_level >= 3) {
361
printk(KERN_DEBUG hfc_DRIVER_PREFIX
369
static inline void hfc_resume_fifo(struct hfc_card *card)
371
card->fifo_suspended = FALSE;
373
hfc_update_fifo_state(card);
376
if (debug_level >= 3) {
377
printk(KERN_DEBUG hfc_DRIVER_PREFIX
385
static void hfc_check_l1_up(struct hfc_card *card)
387
if ((!card->nt_mode && card->l1_state != 7)
388
|| (card->nt_mode && card->l1_state != 3)) {
390
hfc_outb(card, hfc_STATES, hfc_STATES_DO_ACTION |
392
hfc_STATES_NT_G2_G3);
395
* 0 because this is quite verbose when an inferface is unconnected, jaw
398
if (debug_level >= 1) {
399
printk(KERN_DEBUG hfc_DRIVER_PREFIX
401
"L1 is down, bringing up L1.\n",
413
static int hfc_zap_open(struct dahdi_chan *zaptel_chan)
415
struct hfc_chan_duplex *chan = zaptel_chan->pvt;
416
struct hfc_card *card = chan->card;
418
spin_lock(&chan->lock);
420
switch (chan->number) {
422
if (chan->status != free &&
423
chan->status != open_framed) {
424
spin_unlock(&chan->lock);
427
chan->status = open_framed;
432
if (chan->status != free) {
433
spin_unlock(&chan->lock);
436
chan->status = open_voice;
440
chan->open_by_zaptel = TRUE;
441
try_module_get(THIS_MODULE);
442
spin_unlock(&chan->lock);
444
switch (chan->number) {
449
card->regs.m2 |= hfc_M2_PROC_TRANS;
451
* Enable transparent mode
453
card->regs.ctmt |= hfc_CTMT_TRANSB1;
457
card->regs.cirm |= hfc_CIRM_B1_REV;
459
* Enable transmission
461
card->regs.sctrl |= hfc_SCTRL_B1_ENA;
465
card->regs.sctrl_r |= hfc_SCTRL_R_B1_ENA;
469
card->regs.m2 |= hfc_M2_PROC_TRANS;
470
card->regs.ctmt |= hfc_CTMT_TRANSB2;
471
card->regs.cirm |= hfc_CIRM_B2_REV;
472
card->regs.sctrl |= hfc_SCTRL_B2_ENA;
473
card->regs.sctrl_r |= hfc_SCTRL_R_B2_ENA;
479
* If not already enabled, enable processing transition (8KHz)
482
hfc_outb(card, hfc_INT_M2, card->regs.m2);
483
hfc_outb(card, hfc_CTMT, card->regs.ctmt);
484
hfc_outb(card, hfc_CIRM, card->regs.cirm);
485
hfc_outb(card, hfc_SCTRL, card->regs.sctrl);
486
hfc_outb(card, hfc_SCTRL_R, card->regs.sctrl_r);
488
hfc_update_fifo_state(card);
490
printk(KERN_INFO hfc_DRIVER_PREFIX
492
"chan %s opened as %s.\n",
500
static int hfc_zap_close(struct dahdi_chan *zaptel_chan)
502
struct hfc_chan_duplex *chan = zaptel_chan->pvt;
503
struct hfc_card *card = chan->card;
506
printk(KERN_CRIT hfc_DRIVER_PREFIX
507
"hfc_zap_close called with NULL card\n");
511
spin_lock(&chan->lock);
513
if (chan->status == free) {
514
spin_unlock(&chan->lock);
519
chan->open_by_zaptel = FALSE;
521
spin_unlock(&chan->lock);
523
switch (chan->number) {
528
card->regs.ctmt &= ~hfc_CTMT_TRANSB1;
529
card->regs.cirm &= ~hfc_CIRM_B1_REV;
530
card->regs.sctrl &= ~hfc_SCTRL_B1_ENA;
531
card->regs.sctrl_r &= ~hfc_SCTRL_R_B1_ENA;
535
card->regs.ctmt &= ~hfc_CTMT_TRANSB2;
536
card->regs.cirm &= ~hfc_CIRM_B2_REV;
537
card->regs.sctrl &= ~hfc_SCTRL_B2_ENA;
538
card->regs.sctrl_r &= ~hfc_SCTRL_R_B2_ENA;
542
if (card->chans[B1].status == free &&
543
card->chans[B2].status == free)
544
card->regs.m2 &= ~hfc_M2_PROC_TRANS;
546
hfc_outb(card, hfc_INT_M2, card->regs.m2);
547
hfc_outb(card, hfc_CTMT, card->regs.ctmt);
548
hfc_outb(card, hfc_CIRM, card->regs.cirm);
549
hfc_outb(card, hfc_SCTRL, card->regs.sctrl);
550
hfc_outb(card, hfc_SCTRL_R, card->regs.sctrl_r);
552
hfc_update_fifo_state(card);
554
module_put(THIS_MODULE);
556
printk(KERN_INFO hfc_DRIVER_PREFIX
558
"chan %s closed as %s.\n",
566
static int hfc_zap_rbsbits(struct dahdi_chan *chan, int bits)
571
static int hfc_zap_ioctl(struct dahdi_chan *chan,
572
unsigned int cmd, unsigned long data)
583
static void hfc_hdlc_hard_xmit(struct dahdi_chan *d_chan)
585
struct hfc_chan_duplex *chan = d_chan->pvt;
586
struct hfc_card *card = chan->card;
587
struct dahdi_hfc *hfccard = card->ztdev;
589
atomic_inc(&hfccard->hdlc_pending);
593
static int hfc_zap_startup(struct dahdi_span *span)
595
struct dahdi_hfc *zthfc = span->pvt;
596
struct hfc_card *hfctmp = zthfc->card;
600
printk(KERN_INFO hfc_DRIVER_PREFIX
602
"no card for span at startup!\n",
606
alreadyrunning = span->flags & DAHDI_FLAG_RUNNING;
609
span->flags |= DAHDI_FLAG_RUNNING;
614
static int hfc_zap_shutdown(struct dahdi_span *span)
619
static int hfc_zap_maint(struct dahdi_span *span, int cmd)
624
static int hfc_zap_chanconfig(struct dahdi_chan *d_chan, int sigtype)
626
struct hfc_chan_duplex *chan = d_chan->pvt;
627
struct hfc_card *card = chan->card;
628
struct dahdi_hfc *hfccard = card->ztdev;
630
if ((sigtype == DAHDI_SIG_HARDHDLC) && (hfccard->sigchan == d_chan)) {
631
hfccard->sigactive = 0;
632
atomic_set(&hfccard->hdlc_pending, 0);
638
static int hfc_zap_spanconfig(struct dahdi_span *span,
639
struct dahdi_lineconfig *lc)
641
span->lineconfig = lc->lineconfig;
646
static int hfc_zap_initialize(struct dahdi_hfc *hfccard)
648
struct hfc_card *hfctmp = hfccard->card;
651
memset(&hfccard->span, 0x0, sizeof(struct dahdi_span));
652
sprintf(hfccard->span.name, "ZTHFC%d", hfctmp->cardnum + 1);
653
sprintf(hfccard->span.desc,
654
"HFC-S PCI A ISDN card %d [%s] ",
656
hfctmp->nt_mode ? "NT" : "TE");
657
hfccard->span.spantype = hfctmp->nt_mode ? "NT" : "TE";
658
hfccard->span.manufacturer = "Cologne Chips";
659
hfccard->span.spanconfig = hfc_zap_spanconfig;
660
hfccard->span.chanconfig = hfc_zap_chanconfig;
661
hfccard->span.startup = hfc_zap_startup;
662
hfccard->span.shutdown = hfc_zap_shutdown;
663
hfccard->span.maint = hfc_zap_maint;
664
hfccard->span.rbsbits = hfc_zap_rbsbits;
665
hfccard->span.open = hfc_zap_open;
666
hfccard->span.close = hfc_zap_close;
667
hfccard->span.ioctl = hfc_zap_ioctl;
668
hfccard->span.hdlc_hard_xmit = hfc_hdlc_hard_xmit;
669
hfccard->span.flags = 0;
670
hfccard->span.irq = hfctmp->pcidev->irq;
671
dahdi_copy_string(hfccard->span.devicetype, "HFC-S PCI-A ISDN",
672
sizeof(hfccard->span.devicetype));
673
sprintf(hfccard->span.location, "PCI Bus %02d Slot %02d",
674
hfctmp->pcidev->bus->number,
675
PCI_SLOT(hfctmp->pcidev->devfn) + 1);
676
hfccard->span.chans = hfccard->_chans;
677
hfccard->span.channels = 3;
678
for (i = 0; i < hfccard->span.channels; i++)
679
hfccard->_chans[i] = &hfccard->chans[i];
680
hfccard->span.deflaw = DAHDI_LAW_ALAW;
681
hfccard->span.linecompat = DAHDI_CONFIG_AMI | DAHDI_CONFIG_CCS;
682
hfccard->span.offset = 0;
683
init_waitqueue_head(&hfccard->span.maintq);
684
hfccard->span.pvt = hfccard;
686
for (i = 0; i < hfccard->span.channels; i++) {
687
memset(&hfccard->chans[i], 0x0, sizeof(struct dahdi_chan));
689
sprintf(hfccard->chans[i].name,
691
hfctmp->cardnum + 1, 0, i + 1);
693
printk(KERN_INFO hfc_DRIVER_PREFIX
697
hfccard->chans[i].name);
699
if (i == hfccard->span.channels - 1) {
700
hfccard->chans[i].sigcap = DAHDI_SIG_HARDHDLC;
701
hfccard->sigchan = &hfccard->chans[DAHDI_D];
702
hfccard->sigactive = 0;
703
atomic_set(&hfccard->hdlc_pending, 0);
705
hfccard->chans[i].sigcap =
706
DAHDI_SIG_CLEAR | DAHDI_SIG_DACS;
709
hfccard->chans[i].chanpos = i + 1;
712
hfccard->chans[DAHDI_D].readchunk =
713
hfctmp->chans[D].rx.zaptel_buffer;
715
hfccard->chans[DAHDI_D].writechunk =
716
hfctmp->chans[D].tx.zaptel_buffer;
718
hfccard->chans[DAHDI_D].pvt = &hfctmp->chans[D];
720
hfccard->chans[DAHDI_B1].readchunk =
721
hfctmp->chans[B1].rx.zaptel_buffer;
723
hfccard->chans[DAHDI_B1].writechunk =
724
hfctmp->chans[B1].tx.zaptel_buffer;
726
hfccard->chans[DAHDI_B1].pvt = &hfctmp->chans[B1];
728
hfccard->chans[DAHDI_B2].readchunk =
729
hfctmp->chans[B2].rx.zaptel_buffer;
731
hfccard->chans[DAHDI_B2].writechunk =
732
hfctmp->chans[B2].tx.zaptel_buffer;
734
hfccard->chans[DAHDI_B2].pvt = &hfctmp->chans[B2];
736
if (dahdi_register(&hfccard->span, 0)) {
737
printk(KERN_CRIT "unable to register zaptel device!\n");
744
static void hfc_zap_transmit(struct hfc_chan_simplex *chan)
746
hfc_fifo_put(chan, chan->zaptel_buffer, DAHDI_CHUNKSIZE);
749
static void hfc_zap_receive(struct hfc_chan_simplex *chan)
751
hfc_fifo_get(chan, chan->zaptel_buffer, DAHDI_CHUNKSIZE);
754
/******************************************
756
******************************************/
758
static void hfc_handle_timer_interrupt(struct hfc_card *card);
759
static void hfc_handle_state_interrupt(struct hfc_card *card);
760
static void hfc_handle_processing_interrupt(struct hfc_card *card);
761
static void hfc_frame_arrived(struct hfc_chan_duplex *chan);
762
static void hfc_handle_voice(struct hfc_card *card);
764
#if (KERNEL_VERSION(2, 6, 24) < LINUX_VERSION_CODE)
765
static irqreturn_t hfc_interrupt(int irq, void *dev_id)
767
static irqreturn_t hfc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
770
struct hfc_card *card = dev_id;
775
printk(KERN_CRIT hfc_DRIVER_PREFIX
776
"spurious interrupt (IRQ %d)\n",
781
spin_lock_irqsave(&card->lock, flags);
782
status = hfc_inb(card, hfc_STATUS);
783
if (!(status & hfc_STATUS_ANYINT)) {
785
* maybe we are sharing the irq
787
spin_unlock_irqrestore(&card->lock, flags);
791
/* We used to ingore the IRQ when the card was in processing
792
* state but apparently there is no restriction to access the
793
* card in such state:
795
* Joerg Ciesielski wrote:
796
* > There is no restriction for the IRQ handler to access
797
* > HFC-S PCI during processing phase. A IRQ latency of 375 us
798
* > is also no problem since there are no interrupt sources in
799
* > HFC-S PCI which must be handled very fast.
800
* > Due to its deep fifos the IRQ latency can be several ms with
801
* > out the risk of loosing data. Even the S/T state interrupts
802
* > must not be handled with a latency less than <5ms.
804
* > The processing phase only indicates that HFC-S PCI is
805
* > processing the Fifos as PCI master so that data is read and
806
* > written in the 32k memory window. But there is no restriction
807
* > to access data in the memory window during this time.
809
* // if (status & hfc_STATUS_PCI_PROC) {
810
* // return IRQ_HANDLED;
814
s1 = hfc_inb(card, hfc_INT_S1);
815
s2 = hfc_inb(card, hfc_INT_S2);
818
if (s1 & hfc_INTS_TIMER) {
822
hfc_handle_timer_interrupt(card);
825
if (s1 & hfc_INTS_L1STATE) {
827
* state machine (bit 6)
829
hfc_handle_state_interrupt(card);
832
if (s1 & hfc_INTS_DREC) {
836
hfc_frame_arrived(&card->chans[D]);
839
if (s1 & hfc_INTS_B1REC) {
843
hfc_frame_arrived(&card->chans[B1]);
846
if (s1 & hfc_INTS_B2REC) {
850
hfc_frame_arrived(&card->chans[B2]);
853
if (s1 & hfc_INTS_DTRANS) {
859
if (s1 & hfc_INTS_B1TRANS) {
865
if (s1 & hfc_INTS_B2TRANS) {
874
if (s2 & hfc_M2_PMESEL) {
880
* the meaning of this fatal error bit is that HFC-S
881
* PCI as PCI master could not access the PCI bus
882
* within 125us to finish its data processing. If this
883
* happens only very seldom it does not cause big
884
* problems but of course some B-channel or D-channel
885
* data will be corrupted due to this event.
887
* Unfortunately this bit is only set once after the
888
* problem occurs and can only be reseted by a
889
* software reset. That means it is not easily
890
* possible to check how often this fatal error
895
if (!card->sync_loss_reported) {
896
printk(KERN_CRIT hfc_DRIVER_PREFIX
898
"sync lost, pci performance too low!\n",
901
card->sync_loss_reported = TRUE;
905
if (s2 & hfc_M2_GCI_MON_REC) {
907
* RxR monitor channel (bit 2)
911
if (s2 & hfc_M2_GCI_I_CHG) {
913
* GCI I-change (bit 1)
917
if (s2 & hfc_M2_PROC_TRANS) {
919
* processing/non-processing transition (bit 0)
921
hfc_handle_processing_interrupt(card);
926
spin_unlock_irqrestore(&card->lock, flags);
931
static void hfc_handle_timer_interrupt(struct hfc_card *card)
933
if (card->ignore_first_timer_interrupt) {
934
card->ignore_first_timer_interrupt = FALSE;
938
if ((card->nt_mode && card->l1_state == 3) ||
939
(!card->nt_mode && card->l1_state == 7)) {
941
card->regs.ctmt &= ~hfc_CTMT_TIMER_MASK;
942
hfc_outb(card, hfc_CTMT, card->regs.ctmt);
944
hfc_resume_fifo(card);
948
static void hfc_handle_state_interrupt(struct hfc_card *card)
950
u8 new_state = hfc_inb(card, hfc_STATES) & hfc_STATES_STATE_MASK;
953
if (debug_level >= 1) {
954
printk(KERN_DEBUG hfc_DRIVER_PREFIX
956
"layer 1 state = %c%d\n",
958
card->nt_mode ? 'G' : 'F',
968
if (new_state == 3) {
970
* fix to G3 state (see specs)
972
hfc_outb(card, hfc_STATES, hfc_STATES_LOAD_STATE | 3);
975
if (new_state == 3 && card->l1_state != 3)
976
hfc_resume_fifo(card);
978
if (new_state != 3 && card->l1_state == 3)
979
hfc_suspend_fifo(card);
982
if (new_state == 3) {
984
* Keep L1 up... zaptel & libpri expects
986
* Enable only when using an unpatched libpri
990
hfc_outb(card, hfc_STATES,
991
hfc_STATES_DO_ACTION |
993
hfc_STATES_NT_G2_G3);
997
if (new_state == 7 && card->l1_state != 7) {
999
* TE is now active, schedule FIFO activation after
1000
* some time, otherwise the first frames are lost
1003
card->regs.ctmt |= hfc_CTMT_TIMER_50 |
1004
hfc_CTMT_TIMER_CLEAR;
1005
hfc_outb(card, hfc_CTMT, card->regs.ctmt);
1008
* Activating the timer firest an
1009
* interrupt immediately, we
1010
* obviously need to ignore it
1012
card->ignore_first_timer_interrupt = TRUE;
1015
if (new_state != 7 && card->l1_state == 7) {
1017
* TE has become inactive, disable FIFO
1019
hfc_suspend_fifo(card);
1023
card->l1_state = new_state;
1026
static void hfc_handle_processing_interrupt(struct hfc_card *card)
1028
int available_bytes = 0;
1031
* Synchronize with the first enabled channel
1033
if (card->regs.fifo_en & hfc_FIFOEN_B1RX)
1034
available_bytes = hfc_fifo_used_rx(&card->chans[B1].rx);
1035
if (card->regs.fifo_en & hfc_FIFOEN_B2RX)
1036
available_bytes = hfc_fifo_used_rx(&card->chans[B2].rx);
1038
available_bytes = -1;
1040
if ((available_bytes == -1 && card->ticks == 8) ||
1041
available_bytes >= DAHDI_CHUNKSIZE + hfc_RX_FIFO_PRELOAD) {
1044
if (available_bytes > DAHDI_CHUNKSIZE*2 + hfc_RX_FIFO_PRELOAD) {
1047
* we are out of sync, clear fifos, jaw
1049
hfc_clear_fifo_rx(&card->chans[B1].rx);
1050
hfc_clear_fifo_tx(&card->chans[B1].tx);
1051
hfc_clear_fifo_rx(&card->chans[B2].rx);
1052
hfc_clear_fifo_tx(&card->chans[B2].tx);
1055
if (debug_level >= 4) {
1056
printk(KERN_DEBUG hfc_DRIVER_PREFIX
1058
"late IRQ, %d bytes late\n",
1062
hfc_RX_FIFO_PRELOAD));
1066
hfc_handle_voice(card);
1074
static void hfc_handle_voice(struct hfc_card *card)
1076
struct dahdi_hfc *hfccard = card->ztdev;
1077
int frame_left, res;
1078
unsigned char buf[hfc_HDLC_BUF_LEN];
1079
unsigned int size = sizeof(buf) / sizeof(buf[0]);
1082
if (card->chans[B1].status != open_voice &&
1083
card->chans[B2].status != open_voice)
1086
dahdi_transmit(&hfccard->span);
1088
if (card->regs.fifo_en & hfc_FIFOEN_B1TX)
1089
hfc_zap_transmit(&card->chans[B1].tx);
1090
if (card->regs.fifo_en & hfc_FIFOEN_B2TX)
1091
hfc_zap_transmit(&card->chans[B2].tx);
1094
* dahdi hdlc frame tx
1097
if (atomic_read(&hfccard->hdlc_pending)) {
1098
hfc_check_l1_up(card);
1099
res = dahdi_hdlc_getbuf(hfccard->sigchan, buf, &size);
1101
hfccard->sigactive = 1;
1102
memcpy(card->chans[D].tx.ugly_framebuf +
1103
card->chans[D].tx.ugly_framebuf_size,
1105
card->chans[D].tx.ugly_framebuf_size += size;
1107
hfc_fifo_put_frame(&card->chans[D].tx,
1108
card->chans[D].tx.ugly_framebuf,
1109
card->chans[D].tx.ugly_framebuf_size);
1110
++hfccard->frames_out;
1111
hfccard->sigactive = 0;
1112
card->chans[D].tx.ugly_framebuf_size
1114
atomic_dec(&hfccard->hdlc_pending);
1119
* dahdi hdlc frame tx done
1122
if (card->regs.fifo_en & hfc_FIFOEN_B1RX)
1123
hfc_zap_receive(&card->chans[B1].rx);
1125
memset(&card->chans[B1].rx.zaptel_buffer, 0x7f,
1126
sizeof(card->chans[B1].rx.zaptel_buffer));
1128
if (card->regs.fifo_en & hfc_FIFOEN_B2RX)
1129
hfc_zap_receive(&card->chans[B2].rx);
1131
memset(&card->chans[B2].rx.zaptel_buffer, 0x7f,
1132
sizeof(card->chans[B1].rx.zaptel_buffer));
1137
dahdi_ec_chunk(&hfccard->chans[DAHDI_B1],
1138
card->chans[B1].rx.zaptel_buffer,
1139
card->chans[B1].tx.zaptel_buffer);
1140
dahdi_ec_chunk(&hfccard->chans[DAHDI_B2],
1141
card->chans[B2].rx.zaptel_buffer,
1142
card->chans[B2].tx.zaptel_buffer);
1145
* dahdi hdlc frame rx
1147
if (hfc_fifo_has_frames(&card->chans[D].rx))
1148
hfc_frame_arrived(&card->chans[D]);
1150
if (card->chans[D].rx.ugly_framebuf_size) {
1151
frame_left = card->chans[D].rx.ugly_framebuf_size -
1152
card->chans[D].rx.ugly_framebuf_off ;
1153
if (frame_left > hfc_HDLC_BUF_LEN) {
1154
dahdi_hdlc_putbuf(hfccard->sigchan,
1155
card->chans[D].rx.ugly_framebuf +
1156
card->chans[D].rx.ugly_framebuf_off,
1158
card->chans[D].rx.ugly_framebuf_off +=
1161
dahdi_hdlc_putbuf(hfccard->sigchan,
1162
card->chans[D].rx.ugly_framebuf +
1163
card->chans[D].rx.ugly_framebuf_off,
1165
dahdi_hdlc_finish(hfccard->sigchan);
1166
card->chans[D].rx.ugly_framebuf_size = 0;
1167
card->chans[D].rx.ugly_framebuf_off = 0;
1171
* dahdi hdlc frame rx done
1174
if (hfccard->span.flags & DAHDI_FLAG_RUNNING)
1175
dahdi_receive(&hfccard->span);
1179
static void hfc_frame_arrived(struct hfc_chan_duplex *chan)
1181
struct hfc_card *card = chan->card;
1183
struct sk_buff *skb;
1185
while (hfc_fifo_has_frames(&chan->rx) && --antiloop) {
1186
int frame_size = hfc_fifo_get_frame_size(&chan->rx);
1188
if (frame_size < 3) {
1190
if (debug_level >= 2)
1191
printk(KERN_DEBUG hfc_DRIVER_PREFIX
1194
"invalid frame received, "
1201
hfc_fifo_drop_frame(&chan->rx);
1205
} else if (frame_size == 3) {
1207
if (debug_level >= 2)
1208
printk(KERN_DEBUG hfc_DRIVER_PREFIX
1211
"empty frame received\n",
1216
hfc_fifo_drop_frame(&chan->rx);
1222
if (chan->open_by_zaptel &&
1223
card->chans[D].rx.ugly_framebuf_size) {
1226
* We have to wait for Dahdi to transmit the
1227
* frame... wait for next time
1233
skb = dev_alloc_skb(frame_size - 3);
1236
printk(KERN_ERR hfc_DRIVER_PREFIX
1239
"cannot allocate skb: frame dropped\n",
1243
hfc_fifo_drop_frame(&chan->rx);
1251
* HFC does the checksum
1254
skb->ip_summed = CHECKSUM_COMPLETE;
1256
skb->ip_summed = CHECKSUM_HW;
1259
if (chan->open_by_zaptel) {
1260
card->chans[D].rx.ugly_framebuf_size = frame_size - 1;
1262
if (hfc_fifo_get_frame(&card->chans[D].rx,
1263
card->chans[D].rx.ugly_framebuf,
1264
frame_size - 1) == -1) {
1269
memcpy(skb_put(skb, frame_size - 3),
1270
card->chans[D].rx.ugly_framebuf,
1273
if (hfc_fifo_get_frame(&chan->rx,
1274
skb_put(skb, frame_size - 3),
1275
frame_size - 3) == -1) {
1283
printk(KERN_CRIT hfc_DRIVER_PREFIX
1285
"Infinite loop detected\n",
1289
/******************************************
1290
* Module initialization and cleanup
1291
******************************************/
1293
static int __devinit hfc_probe(struct pci_dev *pci_dev,
1294
const struct pci_device_id *ent)
1300
struct hfc_card *card = NULL;
1301
struct dahdi_hfc *zthfc = NULL;
1302
card = kmalloc(sizeof(struct hfc_card), GFP_KERNEL);
1304
printk(KERN_CRIT hfc_DRIVER_PREFIX
1305
"unable to kmalloc!\n");
1307
goto err_alloc_hfccard;
1310
memset(card, 0x00, sizeof(struct hfc_card));
1311
card->cardnum = cardnum;
1312
card->pcidev = pci_dev;
1313
spin_lock_init(&card->lock);
1315
pci_set_drvdata(pci_dev, card);
1317
err = pci_enable_device(pci_dev);
1319
goto err_pci_enable_device;
1321
err = pci_set_dma_mask(pci_dev, PCI_DMA_32BIT);
1323
printk(KERN_ERR hfc_DRIVER_PREFIX
1325
"No suitable DMA configuration available.\n",
1327
goto err_pci_set_dma_mask;
1330
pci_write_config_word(pci_dev, PCI_COMMAND, PCI_COMMAND_MEMORY);
1331
err = pci_request_regions(pci_dev, hfc_DRIVER_NAME);
1333
printk(KERN_CRIT hfc_DRIVER_PREFIX
1335
"cannot request I/O memory region\n",
1337
goto err_pci_request_regions;
1340
pci_set_master(pci_dev);
1342
if (!pci_dev->irq) {
1343
printk(KERN_CRIT hfc_DRIVER_PREFIX
1351
card->io_bus_mem = pci_resource_start(pci_dev, 1);
1352
if (!card->io_bus_mem) {
1353
printk(KERN_CRIT hfc_DRIVER_PREFIX
1361
card->io_mem = ioremap(card->io_bus_mem, hfc_PCI_MEM_SIZE);
1362
if (!(card->io_mem)) {
1363
printk(KERN_CRIT hfc_DRIVER_PREFIX
1365
"cannot ioremap I/O memory\n",
1372
* pci_alloc_consistent guarantees alignment
1373
* (Documentation/DMA-mapping.txt)
1375
card->fifo_mem = pci_alloc_consistent(pci_dev,
1376
hfc_FIFO_SIZE, &card->fifo_bus_mem);
1377
if (!card->fifo_mem) {
1378
printk(KERN_CRIT hfc_DRIVER_PREFIX
1380
"unable to allocate FIFO DMA memory!\n",
1383
goto err_alloc_fifo;
1386
memset(card->fifo_mem, 0x00, hfc_FIFO_SIZE);
1388
card->fifos = card->fifo_mem;
1390
pci_write_config_dword(card->pcidev, hfc_PCI_MWBA, card->fifo_bus_mem);
1392
err = request_irq(card->pcidev->irq, &hfc_interrupt,
1394
#if (KERNEL_VERSION(2, 6, 23) < LINUX_VERSION_CODE)
1395
IRQF_SHARED, hfc_DRIVER_NAME, card);
1397
SA_SHIRQ, hfc_DRIVER_NAME, card);
1401
printk(KERN_CRIT hfc_DRIVER_PREFIX
1403
"unable to register irq\n",
1405
goto err_request_irq;
1408
card->nt_mode = FALSE;
1410
if (modes & (1 << card->cardnum))
1411
card->nt_mode = TRUE;
1413
for (i = 0; i < nt_modes_count; i++) {
1414
if (nt_modes[i] == card->cardnum)
1415
card->nt_mode = TRUE;
1421
card->chans[D].card = card;
1422
card->chans[D].name = "D";
1423
card->chans[D].status = free;
1424
card->chans[D].number = D;
1425
spin_lock_init(&card->chans[D].lock);
1427
card->chans[D].rx.chan = &card->chans[D];
1428
card->chans[D].rx.fifo_base = card->fifos + 0x4000;
1429
card->chans[D].rx.z_base = card->fifos + 0x4000;
1430
card->chans[D].rx.z1_base = card->fifos + 0x6080;
1431
card->chans[D].rx.z2_base = card->fifos + 0x6082;
1432
card->chans[D].rx.z_min = 0x0000;
1433
card->chans[D].rx.z_max = 0x01FF;
1434
card->chans[D].rx.f_min = 0x10;
1435
card->chans[D].rx.f_max = 0x1F;
1436
card->chans[D].rx.f1 = card->fifos + 0x60a0;
1437
card->chans[D].rx.f2 = card->fifos + 0x60a1;
1438
card->chans[D].rx.fifo_size = card->chans[D].rx.z_max
1439
- card->chans[D].rx.z_min + 1;
1440
card->chans[D].rx.f_num = card->chans[D].rx.f_max
1441
- card->chans[D].rx.f_min + 1;
1443
card->chans[D].tx.chan = &card->chans[D];
1444
card->chans[D].tx.fifo_base = card->fifos + 0x0000;
1445
card->chans[D].tx.z_base = card->fifos + 0x0000;
1446
card->chans[D].tx.z1_base = card->fifos + 0x2080;
1447
card->chans[D].tx.z2_base = card->fifos + 0x2082;
1448
card->chans[D].tx.z_min = 0x0000;
1449
card->chans[D].tx.z_max = 0x01FF;
1450
card->chans[D].tx.f_min = 0x10;
1451
card->chans[D].tx.f_max = 0x1F;
1452
card->chans[D].tx.f1 = card->fifos + 0x20a0;
1453
card->chans[D].tx.f2 = card->fifos + 0x20a1;
1454
card->chans[D].tx.fifo_size = card->chans[D].tx.z_max -
1455
card->chans[D].tx.z_min + 1;
1456
card->chans[D].tx.f_num = card->chans[D].tx.f_max -
1457
card->chans[D].tx.f_min + 1;
1462
card->chans[B1].card = card;
1463
card->chans[B1].name = "B1";
1464
card->chans[B1].status = free;
1465
card->chans[B1].number = B1;
1466
card->chans[B1].protocol = 0;
1467
spin_lock_init(&card->chans[B1].lock);
1469
card->chans[B1].rx.chan = &card->chans[B1];
1470
card->chans[B1].rx.fifo_base = card->fifos + 0x4200;
1471
card->chans[B1].rx.z_base = card->fifos + 0x4000;
1472
card->chans[B1].rx.z1_base = card->fifos + 0x6000;
1473
card->chans[B1].rx.z2_base = card->fifos + 0x6002;
1474
card->chans[B1].rx.z_min = 0x0200;
1475
card->chans[B1].rx.z_max = 0x1FFF;
1476
card->chans[B1].rx.f_min = 0x00;
1477
card->chans[B1].rx.f_max = 0x1F;
1478
card->chans[B1].rx.f1 = card->fifos + 0x6080;
1479
card->chans[B1].rx.f2 = card->fifos + 0x6081;
1480
card->chans[B1].rx.fifo_size = card->chans[B1].rx.z_max -
1481
card->chans[B1].rx.z_min + 1;
1482
card->chans[B1].rx.f_num = card->chans[B1].rx.f_max -
1483
card->chans[B1].rx.f_min + 1;
1485
card->chans[B1].tx.chan = &card->chans[B1];
1486
card->chans[B1].tx.fifo_base = card->fifos + 0x0200;
1487
card->chans[B1].tx.z_base = card->fifos + 0x0000;
1488
card->chans[B1].tx.z1_base = card->fifos + 0x2000;
1489
card->chans[B1].tx.z2_base = card->fifos + 0x2002;
1490
card->chans[B1].tx.z_min = 0x0200;
1491
card->chans[B1].tx.z_max = 0x1FFF;
1492
card->chans[B1].tx.f_min = 0x00;
1493
card->chans[B1].tx.f_max = 0x1F;
1494
card->chans[B1].tx.f1 = card->fifos + 0x2080;
1495
card->chans[B1].tx.f2 = card->fifos + 0x2081;
1496
card->chans[B1].tx.fifo_size = card->chans[B1].tx.z_max -
1497
card->chans[B1].tx.z_min + 1;
1498
card->chans[B1].tx.f_num = card->chans[B1].tx.f_max -
1499
card->chans[B1].tx.f_min + 1;
1504
card->chans[B2].card = card;
1505
card->chans[B2].name = "B2";
1506
card->chans[B2].status = free;
1507
card->chans[B2].number = B2;
1508
card->chans[B2].protocol = 0;
1509
spin_lock_init(&card->chans[B2].lock);
1511
card->chans[B2].rx.chan = &card->chans[B2];
1512
card->chans[B2].rx.fifo_base = card->fifos + 0x6200,
1513
card->chans[B2].rx.z_base = card->fifos + 0x6000;
1514
card->chans[B2].rx.z1_base = card->fifos + 0x6100;
1515
card->chans[B2].rx.z2_base = card->fifos + 0x6102;
1516
card->chans[B2].rx.z_min = 0x0200;
1517
card->chans[B2].rx.z_max = 0x1FFF;
1518
card->chans[B2].rx.f_min = 0x00;
1519
card->chans[B2].rx.f_max = 0x1F;
1520
card->chans[B2].rx.f1 = card->fifos + 0x6180;
1521
card->chans[B2].rx.f2 = card->fifos + 0x6181;
1522
card->chans[B2].rx.fifo_size = card->chans[B2].rx.z_max -
1523
card->chans[B2].rx.z_min + 1;
1524
card->chans[B2].rx.f_num = card->chans[B2].rx.f_max -
1525
card->chans[B2].rx.f_min + 1;
1527
card->chans[B2].tx.chan = &card->chans[B2];
1528
card->chans[B2].tx.fifo_base = card->fifos + 0x2200;
1529
card->chans[B2].tx.z_base = card->fifos + 0x2000;
1530
card->chans[B2].tx.z1_base = card->fifos + 0x2100;
1531
card->chans[B2].tx.z2_base = card->fifos + 0x2102;
1532
card->chans[B2].tx.z_min = 0x0200;
1533
card->chans[B2].tx.z_max = 0x1FFF;
1534
card->chans[B2].tx.f_min = 0x00;
1535
card->chans[B2].tx.f_max = 0x1F;
1536
card->chans[B2].tx.f1 = card->fifos + 0x2180;
1537
card->chans[B2].tx.f2 = card->fifos + 0x2181;
1538
card->chans[B2].tx.fifo_size = card->chans[B2].tx.z_max -
1539
card->chans[B2].tx.z_min + 1;
1540
card->chans[B2].tx.f_num = card->chans[B2].tx.f_max -
1541
card->chans[B2].tx.f_min + 1;
1547
zthfc = kmalloc(sizeof(struct dahdi_hfc), GFP_KERNEL);
1549
printk(KERN_CRIT hfc_DRIVER_PREFIX
1550
"unable to kmalloc!\n");
1551
goto err_request_irq;
1553
memset(zthfc, 0x0, sizeof(struct dahdi_hfc));
1556
hfc_zap_initialize(zthfc);
1557
card->ztdev = zthfc;
1559
snprintf(card->proc_dir_name,
1560
sizeof(card->proc_dir_name),
1561
"%d", card->cardnum);
1562
card->proc_dir = proc_mkdir(card->proc_dir_name, hfc_proc_zaphfc_dir);
1563
SET_PROC_DIRENTRY_OWNER(card->proc_dir);
1565
hfc_resetCard(card);
1567
printk(KERN_INFO hfc_DRIVER_PREFIX
1568
"card %d configured for %s mode at mem %#lx (0x%p) IRQ %u\n",
1570
card->nt_mode ? "NT" : "TE",
1580
pci_free_consistent(pci_dev, hfc_FIFO_SIZE,
1581
card->fifo_mem, card->fifo_bus_mem);
1583
iounmap(card->io_mem);
1587
pci_release_regions(pci_dev);
1588
err_pci_request_regions:
1589
err_pci_set_dma_mask:
1590
err_pci_enable_device:
1596
static void __devexit hfc_remove(struct pci_dev *pci_dev)
1598
struct hfc_card *card = pci_get_drvdata(pci_dev);
1601
printk(KERN_INFO hfc_DRIVER_PREFIX
1603
"shutting down card at %p.\n",
1607
hfc_softreset(card);
1609
dahdi_unregister(&card->ztdev->span);
1613
* disable memio and bustmaster
1615
pci_write_config_word(pci_dev, PCI_COMMAND, 0);
1617
remove_proc_entry("bufs", card->proc_dir);
1618
remove_proc_entry("fifos", card->proc_dir);
1619
remove_proc_entry("info", card->proc_dir);
1620
remove_proc_entry(card->proc_dir_name, hfc_proc_zaphfc_dir);
1622
free_irq(pci_dev->irq, card);
1624
pci_free_consistent(pci_dev, hfc_FIFO_SIZE,
1625
card->fifo_mem, card->fifo_bus_mem);
1627
iounmap(card->io_mem);
1629
pci_release_regions(pci_dev);
1631
pci_disable_device(pci_dev);
1636
/******************************************
1638
******************************************/
1640
static int __init hfc_init_module(void)
1644
printk(KERN_INFO hfc_DRIVER_PREFIX
1645
hfc_DRIVER_STRING " loading\n");
1647
#if (KERNEL_VERSION(2, 6, 26) <= LINUX_VERSION_CODE)
1648
hfc_proc_zaphfc_dir = proc_mkdir(hfc_DRIVER_NAME, NULL);
1650
hfc_proc_zaphfc_dir = proc_mkdir(hfc_DRIVER_NAME, proc_root_driver);
1653
ret = dahdi_pci_module(&hfc_driver);
1657
module_init(hfc_init_module);
1659
static void __exit hfc_module_exit(void)
1661
pci_unregister_driver(&hfc_driver);
1663
#if (KERNEL_VERSION(2, 6, 26) <= LINUX_VERSION_CODE)
1664
remove_proc_entry(hfc_DRIVER_NAME, NULL);
1666
remove_proc_entry(hfc_DRIVER_NAME, proc_root_driver);
1669
printk(KERN_INFO hfc_DRIVER_PREFIX
1670
hfc_DRIVER_STRING " unloaded\n");
1673
module_exit(hfc_module_exit);
1677
MODULE_DESCRIPTION(hfc_DRIVER_DESCR);
1678
MODULE_AUTHOR("Jens Wilke <jw_vzaphfc@headissue.com>, "
1679
"Daniele (Vihai) Orlandi <daniele@orlandi.com>, "
1680
"Jose A. Deniz <odicha@hotmail.com>");
1681
MODULE_ALIAS("vzaphfc");
1682
#ifdef MODULE_LICENSE
1683
MODULE_LICENSE("GPL");
1687
module_param(modes, int, 0444);
1689
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 10)
1690
module_param_array(nt_modes, int, &nt_modes_count, 0444);
1692
module_param_array(nt_modes, int, nt_modes_count, 0444);
1695
module_param(force_l1_up, int, 0444);
1697
module_param(debug_level, int, 0444);
1700
MODULE_PARM_DESC(modes, "[Deprecated] bit-mask to configure NT mode");
1701
MODULE_PARM_DESC(nt_modes,
1702
"Comma-separated list of card IDs to configure in NT mode");
1703
MODULE_PARM_DESC(force_l1_up, "Don't allow L1 to go down");
1705
MODULE_PARM_DESC(debug_level, "Debug verbosity level");