1 /* $Id: nj_u.c,v 2.8.6.6 2001/09/23 22:24:50 kai Exp $
3 * This software may be used and distributed according to the terms
4 * of the GNU General Public License, incorporated herein by reference.
8 #include <linux/config.h>
9 #include <linux/init.h>
13 #include <linux/pci.h>
14 #include <linux/interrupt.h>
15 #include <linux/ppp_defs.h>
18 const char *NETjet_U_revision
= "$Revision: 2.8.6.6 $";
21 nj_u_interrupt(int intno
, void *dev_id
, struct pt_regs
*regs
)
23 struct IsdnCardState
*cs
= dev_id
;
27 if (!((sval
= bytein(cs
->hw
.njet
.base
+ NETJET_IRQSTAT1
)) &
29 val
= NETjet_ReadIC(cs
, ICC_ISTA
);
30 if (cs
->debug
& L1_DEB_ISAC
)
31 debugl1(cs
, "tiger: i1 %x %x", sval
, val
);
33 icc_interrupt(cs
, val
);
34 NETjet_WriteIC(cs
, ICC_MASK
, 0xFF);
35 NETjet_WriteIC(cs
, ICC_MASK
, 0x0);
38 /* start new code 13/07/00 GE */
39 /* set bits in sval to indicate which page is free */
40 if (inl(cs
->hw
.njet
.base
+ NETJET_DMA_WRITE_ADR
) <
41 inl(cs
->hw
.njet
.base
+ NETJET_DMA_WRITE_IRQ
))
42 /* the 2nd write page is free */
44 else /* the 1st write page is free */
46 if (inl(cs
->hw
.njet
.base
+ NETJET_DMA_READ_ADR
) <
47 inl(cs
->hw
.njet
.base
+ NETJET_DMA_READ_IRQ
))
48 /* the 2nd read page is free */
50 else /* the 1st read page is free */
52 if (sval
!= cs
->hw
.njet
.last_is0
) /* we have a DMA interrupt */
54 cs
->hw
.njet
.irqstat0
= sval
;
55 if ((cs
->hw
.njet
.irqstat0
& NETJET_IRQM0_READ
) !=
56 (cs
->hw
.njet
.last_is0
& NETJET_IRQM0_READ
))
57 /* we have a read dma int */
59 if ((cs
->hw
.njet
.irqstat0
& NETJET_IRQM0_WRITE
) !=
60 (cs
->hw
.njet
.last_is0
& NETJET_IRQM0_WRITE
))
61 /* we have a write dma int */
63 /* end new code 13/07/00 GE */
66 cs->hw.njet.dmactrl = 0;
67 byteout(cs->hw.njet.base + NETJET_DMACTRL,
69 byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0);
72 spin_unlock(&cs
->lock
);
77 nj_u_reset(struct IsdnCardState
*cs
)
79 cs
->hw
.njet
.ctrl_reg
= 0xff; /* Reset On */
80 byteout(cs
->hw
.njet
.base
+ NETJET_CTRL
, cs
->hw
.njet
.ctrl_reg
);
81 set_current_state(TASK_UNINTERRUPTIBLE
);
82 schedule_timeout((10*HZ
)/1000); /* Timeout 10ms */
83 cs
->hw
.njet
.ctrl_reg
= 0x40; /* Reset Off and status read clear */
84 /* now edge triggered for TJ320 GE 13/07/00 */
85 byteout(cs
->hw
.njet
.base
+ NETJET_CTRL
, cs
->hw
.njet
.ctrl_reg
);
86 set_current_state(TASK_UNINTERRUPTIBLE
);
87 schedule_timeout((10*HZ
)/1000); /* Timeout 10ms */
89 cs
->hw
.njet
.auxd
= 0xC0;
90 cs
->hw
.njet
.dmactrl
= 0;
91 byteout(cs
->hw
.njet
.auxa
, 0);
92 byteout(cs
->hw
.njet
.base
+ NETJET_AUXCTRL
, ~NETJET_ISACIRQ
);
93 byteout(cs
->hw
.njet
.base
+ NETJET_IRQMASK1
, NETJET_ISACIRQ
);
94 byteout(cs
->hw
.njet
.auxa
, cs
->hw
.njet
.auxd
);
99 nj_u_init(struct IsdnCardState
*cs
)
103 /* Reenable all IRQ */
104 NETjet_WriteIC(cs
, ICC_MASK
, 0);
107 static struct card_ops nj_u_ops
= {
110 .release
= netjet_release
,
111 .irq_func
= nj_u_interrupt
,
115 nj_u_probe(struct IsdnCardState
*cs
, struct pci_dev
*pdev
)
117 if (pci_enable_device(pdev
))
120 pci_set_master(pdev
);
123 cs
->irq_flags
|= SA_SHIRQ
;
124 cs
->hw
.njet
.pdev
= pdev
;
125 cs
->hw
.njet
.base
= pci_resource_start(pdev
, 0);
126 if (!request_io(&cs
->rs
, cs
->hw
.njet
.base
, 0x100, "netspider-u isdn"))
129 cs
->hw
.njet
.auxa
= cs
->hw
.njet
.base
+ NETJET_AUXDATA
;
130 cs
->hw
.njet
.isac
= cs
->hw
.njet
.base
| NETJET_ISAC_OFF
;
132 cs
->hw
.njet
.ctrl_reg
= 0xff; /* Reset On */
133 byteout(cs
->hw
.njet
.base
+ NETJET_CTRL
, cs
->hw
.njet
.ctrl_reg
);
135 set_current_state(TASK_UNINTERRUPTIBLE
);
136 schedule_timeout((10*HZ
)/1000); /* Timeout 10ms */
138 cs
->hw
.njet
.ctrl_reg
= 0x00; /* Reset Off and status read clear */
139 byteout(cs
->hw
.njet
.base
+ NETJET_CTRL
, cs
->hw
.njet
.ctrl_reg
);
141 set_current_state(TASK_UNINTERRUPTIBLE
);
142 schedule_timeout((10*HZ
)/1000); /* Timeout 10ms */
144 cs
->hw
.njet
.auxd
= 0xC0;
145 cs
->hw
.njet
.dmactrl
= 0;
147 byteout(cs
->hw
.njet
.base
+ NETJET_AUXCTRL
, ~NETJET_ISACIRQ
);
148 byteout(cs
->hw
.njet
.base
+ NETJET_IRQMASK1
, NETJET_ISACIRQ
);
149 byteout(cs
->hw
.njet
.auxa
, cs
->hw
.njet
.auxd
);
151 switch ((NETjet_ReadIC(cs
, ICC_RBCH
) >> 5) & 3) {
155 printk(KERN_WARNING
"NETspider-U: NETjet-S PCI card found\n" );
158 printk(KERN_WARNING
"NETspider-U: No PCI card found\n" );
161 printk(KERN_INFO
"NETspider-U: PCI card configured at %#lx IRQ %d\n",
162 cs
->hw
.njet
.base
, cs
->irq
);
165 cs
->card_ops
= &nj_u_ops
;
166 icc_setup(cs
, &netjet_dc_ops
);
169 hisax_release_resources(cs
);
173 static struct pci_dev
*dev_netjet __initdata
= NULL
;
176 setup_netjet_u(struct IsdnCard
*card
)
180 #error "not running on big endian machines now"
182 strcpy(tmp
, NETjet_U_revision
);
183 printk(KERN_INFO
"HiSax: Traverse Tech. NETspider-U driver Rev. %s\n",
186 dev_netjet
= pci_find_device(PCI_VENDOR_ID_TIGERJET
,
187 PCI_DEVICE_ID_TIGERJET_300
, dev_netjet
);
189 if (nj_u_probe(card
->cs
, dev_netjet
))
193 printk(KERN_WARNING
"NETspider-U: No PCI card found\n");