- Andries Brouwer: final isofs pieces.
[davej-history.git] / drivers / isdn / hisax / nj_s.c
blob4aaf9e1857a73fb07572afb3c2d910e3b65ed89a
1 // $Id: nj_s.c,v 2.7.6.1 2000/11/29 16:00:14 kai Exp $
2 //
3 // This file is (c) under GNU PUBLIC LICENSE
4 //
6 #define __NO_VERSION__
7 #include <linux/config.h>
8 #include <linux/init.h>
9 #include "hisax.h"
10 #include "isac.h"
11 #include "isdnl1.h"
12 #include <linux/pci.h>
13 #include <linux/interrupt.h>
14 #include <linux/ppp_defs.h>
15 #include "netjet.h"
17 const char *NETjet_S_revision = "$Revision: 2.7.6.1 $";
19 static u_char dummyrr(struct IsdnCardState *cs, int chan, u_char off)
21 return(5);
24 static void dummywr(struct IsdnCardState *cs, int chan, u_char off, u_char value)
28 static void
29 netjet_s_interrupt(int intno, void *dev_id, struct pt_regs *regs)
31 struct IsdnCardState *cs = dev_id;
32 u_char val, sval;
33 long flags;
35 if (!cs) {
36 printk(KERN_WARNING "NETjet-S: Spurious interrupt!\n");
37 return;
39 if (!((sval = bytein(cs->hw.njet.base + NETJET_IRQSTAT1)) &
40 NETJET_ISACIRQ)) {
41 val = NETjet_ReadIC(cs, ISAC_ISTA);
42 if (cs->debug & L1_DEB_ISAC)
43 debugl1(cs, "tiger: i1 %x %x", sval, val);
44 if (val) {
45 isac_interrupt(cs, val);
46 NETjet_WriteIC(cs, ISAC_MASK, 0xFF);
47 NETjet_WriteIC(cs, ISAC_MASK, 0x0);
50 save_flags(flags);
51 cli();
52 /* start new code 13/07/00 GE */
53 /* set bits in sval to indicate which page is free */
54 if (inl(cs->hw.njet.base + NETJET_DMA_WRITE_ADR) <
55 inl(cs->hw.njet.base + NETJET_DMA_WRITE_IRQ))
56 /* the 2nd write page is free */
57 sval = 0x08;
58 else /* the 1st write page is free */
59 sval = 0x04;
60 if (inl(cs->hw.njet.base + NETJET_DMA_READ_ADR) <
61 inl(cs->hw.njet.base + NETJET_DMA_READ_IRQ))
62 /* the 2nd read page is free */
63 sval = sval | 0x02;
64 else /* the 1st read page is free */
65 sval = sval | 0x01;
66 if (sval != cs->hw.njet.last_is0) /* we have a DMA interrupt */
68 if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
69 restore_flags(flags);
70 return;
72 cs->hw.njet.irqstat0 = sval;
73 restore_flags(flags);
74 if ((cs->hw.njet.irqstat0 & NETJET_IRQM0_READ) !=
75 (cs->hw.njet.last_is0 & NETJET_IRQM0_READ))
76 /* we have a read dma int */
77 read_tiger(cs);
78 if ((cs->hw.njet.irqstat0 & NETJET_IRQM0_WRITE) !=
79 (cs->hw.njet.last_is0 & NETJET_IRQM0_WRITE))
80 /* we have a write dma int */
81 write_tiger(cs);
82 /* end new code 13/07/00 GE */
83 test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
84 } else
85 restore_flags(flags);
87 /* if (!testcnt--) {
88 cs->hw.njet.dmactrl = 0;
89 byteout(cs->hw.njet.base + NETJET_DMACTRL,
90 cs->hw.njet.dmactrl);
91 byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0);
96 static void
97 reset_netjet_s(struct IsdnCardState *cs)
99 long flags;
101 save_flags(flags);
102 sti();
103 cs->hw.njet.ctrl_reg = 0xff; /* Reset On */
104 byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg);
105 set_current_state(TASK_UNINTERRUPTIBLE);
106 schedule_timeout((10*HZ)/1000); /* Timeout 10ms */
107 cs->hw.njet.ctrl_reg = 0x40; /* Reset Off and status read clear */
108 /* now edge triggered for TJ320 GE 13/07/00 */
109 byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg);
110 set_current_state(TASK_UNINTERRUPTIBLE);
111 schedule_timeout((10*HZ)/1000); /* Timeout 10ms */
112 restore_flags(flags);
113 cs->hw.njet.auxd = 0;
114 cs->hw.njet.dmactrl = 0;
115 byteout(cs->hw.njet.base + NETJET_AUXCTRL, ~NETJET_ISACIRQ);
116 byteout(cs->hw.njet.base + NETJET_IRQMASK1, NETJET_ISACIRQ);
117 byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
120 static int
121 NETjet_S_card_msg(struct IsdnCardState *cs, int mt, void *arg)
123 switch (mt) {
124 case CARD_RESET:
125 reset_netjet_s(cs);
126 return(0);
127 case CARD_RELEASE:
128 release_io_netjet(cs);
129 return(0);
130 case CARD_INIT:
131 inittiger(cs);
132 clear_pending_isac_ints(cs);
133 initisac(cs);
134 /* Reenable all IRQ */
135 cs->writeisac(cs, ISAC_MASK, 0);
136 return(0);
137 case CARD_TEST:
138 return(0);
140 return(0);
143 static struct pci_dev *dev_netjet __initdata = NULL;
145 int __init
146 setup_netjet_s(struct IsdnCard *card)
148 int bytecnt;
149 struct IsdnCardState *cs = card->cs;
150 char tmp[64];
151 long flags;
153 #ifdef __BIG_ENDIAN
154 #error "not running on big endian machines now"
155 #endif
156 strcpy(tmp, NETjet_S_revision);
157 printk(KERN_INFO "HiSax: Traverse Tech. NETjet-S driver Rev. %s\n", HiSax_getrev(tmp));
158 if (cs->typ != ISDN_CTYPE_NETJET_S)
159 return(0);
160 test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
162 #if CONFIG_PCI
164 for ( ;; )
166 if (!pci_present()) {
167 printk(KERN_ERR "Netjet: no PCI bus present\n");
168 return(0);
170 if ((dev_netjet = pci_find_device(PCI_VENDOR_ID_TIGERJET,
171 PCI_DEVICE_ID_TIGERJET_300, dev_netjet))) {
172 if (pci_enable_device(dev_netjet))
173 return(0);
174 cs->irq = dev_netjet->irq;
175 if (!cs->irq) {
176 printk(KERN_WARNING "NETjet-S: No IRQ for PCI card found\n");
177 return(0);
179 cs->hw.njet.base = pci_resource_start(dev_netjet, 0);
180 if (!cs->hw.njet.base) {
181 printk(KERN_WARNING "NETjet-S: No IO-Adr for PCI card found\n");
182 return(0);
184 } else {
185 printk(KERN_WARNING "NETjet-S: No PCI card found\n");
186 return(0);
189 cs->hw.njet.auxa = cs->hw.njet.base + NETJET_AUXDATA;
190 cs->hw.njet.isac = cs->hw.njet.base | NETJET_ISAC_OFF;
192 save_flags(flags);
193 sti();
195 cs->hw.njet.ctrl_reg = 0xff; /* Reset On */
196 byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg);
198 set_current_state(TASK_UNINTERRUPTIBLE);
199 schedule_timeout((10*HZ)/1000); /* Timeout 10ms */
201 cs->hw.njet.ctrl_reg = 0x00; /* Reset Off and status read clear */
202 byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg);
204 set_current_state(TASK_UNINTERRUPTIBLE);
205 schedule_timeout((10*HZ)/1000); /* Timeout 10ms */
207 restore_flags(flags);
209 cs->hw.njet.auxd = 0xC0;
210 cs->hw.njet.dmactrl = 0;
212 byteout(cs->hw.njet.base + NETJET_AUXCTRL, ~NETJET_ISACIRQ);
213 byteout(cs->hw.njet.base + NETJET_IRQMASK1, NETJET_ISACIRQ);
214 byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
216 switch ( ( ( NETjet_ReadIC( cs, ISAC_RBCH ) >> 5 ) & 3 ) )
218 case 0 :
219 break;
221 case 3 :
222 printk( KERN_WARNING "NETjet-S: NETspider-U PCI card found\n" );
223 continue;
225 default :
226 printk( KERN_WARNING "NETjet-S: No PCI card found\n" );
227 return 0;
229 break;
231 #else
233 printk(KERN_WARNING "NETjet-S: NO_PCI_BIOS\n");
234 printk(KERN_WARNING "NETjet-S: unable to config NETJET-S PCI\n");
235 return (0);
237 #endif /* CONFIG_PCI */
239 bytecnt = 256;
241 printk(KERN_INFO
242 "NETjet-S: PCI card configured at 0x%x IRQ %d\n",
243 cs->hw.njet.base, cs->irq);
244 if (check_region(cs->hw.njet.base, bytecnt)) {
245 printk(KERN_WARNING
246 "HiSax: %s config port %x-%x already in use\n",
247 CardType[card->typ],
248 cs->hw.njet.base,
249 cs->hw.njet.base + bytecnt);
250 return (0);
251 } else {
252 request_region(cs->hw.njet.base, bytecnt, "netjet-s isdn");
254 reset_netjet_s(cs);
255 cs->readisac = &NETjet_ReadIC;
256 cs->writeisac = &NETjet_WriteIC;
257 cs->readisacfifo = &NETjet_ReadICfifo;
258 cs->writeisacfifo = &NETjet_WriteICfifo;
259 cs->BC_Read_Reg = &dummyrr;
260 cs->BC_Write_Reg = &dummywr;
261 cs->BC_Send_Data = &netjet_fill_dma;
262 cs->cardmsg = &NETjet_S_card_msg;
263 cs->irq_func = &netjet_s_interrupt;
264 cs->irq_flags |= SA_SHIRQ;
265 ISACVersion(cs, "NETjet-S:");
266 return (1);