Linux 2.4.0-test7-pre6
[davej-history.git] / drivers / isdn / hisax / nj_s.c
blob2acb1a6de08cf8ef319626862c762442bd49d56a
1 // $Id: nj_s.c,v 2.3 2000/06/26 08:59:14 keil Exp $
2 //
3 // This file is (c) under GNU PUBLIC LICENSE
4 //
5 #define __NO_VERSION__
6 #include <linux/config.h>
7 #include "hisax.h"
8 #include "isac.h"
9 #include "isdnl1.h"
10 #include <linux/pci.h>
11 #include <linux/interrupt.h>
12 #include <linux/ppp_defs.h>
13 #include "netjet.h"
15 const char *NETjet_S_revision = "$Revision: 2.3 $";
17 static u_char dummyrr(struct IsdnCardState *cs, int chan, u_char off)
19 return(5);
22 static void dummywr(struct IsdnCardState *cs, int chan, u_char off, u_char value)
26 static void
27 netjet_s_interrupt(int intno, void *dev_id, struct pt_regs *regs)
29 struct IsdnCardState *cs = dev_id;
30 u_char val, sval;
31 long flags;
33 if (!cs) {
34 printk(KERN_WARNING "NETjet-S: Spurious interrupt!\n");
35 return;
37 if (!((sval = bytein(cs->hw.njet.base + NETJET_IRQSTAT1)) &
38 NETJET_ISACIRQ)) {
39 val = NETjet_ReadIC(cs, ISAC_ISTA);
40 if (cs->debug & L1_DEB_ISAC)
41 debugl1(cs, "tiger: i1 %x %x", sval, val);
42 if (val) {
43 isac_interrupt(cs, val);
44 NETjet_WriteIC(cs, ISAC_MASK, 0xFF);
45 NETjet_WriteIC(cs, ISAC_MASK, 0x0);
48 save_flags(flags);
49 cli();
50 if ((sval = bytein(cs->hw.njet.base + NETJET_IRQSTAT0))) {
51 if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
52 restore_flags(flags);
53 return;
55 cs->hw.njet.irqstat0 = sval;
56 restore_flags(flags);
57 /* debugl1(cs, "tiger: ist0 %x %x %x %x/%x pulse=%d",
58 sval,
59 bytein(cs->hw.njet.base + NETJET_DMACTRL),
60 bytein(cs->hw.njet.base + NETJET_IRQMASK0),
61 inl(cs->hw.njet.base + NETJET_DMA_READ_ADR),
62 inl(cs->hw.njet.base + NETJET_DMA_WRITE_ADR),
63 bytein(cs->hw.njet.base + NETJET_PULSE_CNT));
65 /* cs->hw.njet.irqmask0 = ((0x0f & cs->hw.njet.irqstat0) ^ 0x0f) | 0x30;
66 */ byteout(cs->hw.njet.base + NETJET_IRQSTAT0, cs->hw.njet.irqstat0);
67 /* byteout(cs->hw.njet.base + NETJET_IRQMASK0, cs->hw.njet.irqmask0);
68 */ if (cs->hw.njet.irqstat0 & NETJET_IRQM0_READ)
69 read_tiger(cs);
70 if (cs->hw.njet.irqstat0 & NETJET_IRQM0_WRITE)
71 write_tiger(cs);
72 test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
73 } else
74 restore_flags(flags);
76 /* if (!testcnt--) {
77 cs->hw.njet.dmactrl = 0;
78 byteout(cs->hw.njet.base + NETJET_DMACTRL,
79 cs->hw.njet.dmactrl);
80 byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0);
85 static void
86 reset_netjet_s(struct IsdnCardState *cs)
88 long flags;
90 save_flags(flags);
91 sti();
92 cs->hw.njet.ctrl_reg = 0xff; /* Reset On */
93 byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg);
94 set_current_state(TASK_UNINTERRUPTIBLE);
95 schedule_timeout((10*HZ)/1000); /* Timeout 10ms */
96 cs->hw.njet.ctrl_reg = 0x00; /* Reset Off and status read clear */
97 byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg);
98 set_current_state(TASK_UNINTERRUPTIBLE);
99 schedule_timeout((10*HZ)/1000); /* Timeout 10ms */
100 restore_flags(flags);
101 cs->hw.njet.auxd = 0;
102 cs->hw.njet.dmactrl = 0;
103 byteout(cs->hw.njet.base + NETJET_AUXCTRL, ~NETJET_ISACIRQ);
104 byteout(cs->hw.njet.base + NETJET_IRQMASK1, NETJET_ISACIRQ);
105 byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
108 static int
109 NETjet_S_card_msg(struct IsdnCardState *cs, int mt, void *arg)
111 switch (mt) {
112 case CARD_RESET:
113 reset_netjet_s(cs);
114 return(0);
115 case CARD_RELEASE:
116 release_io_netjet(cs);
117 return(0);
118 case CARD_INIT:
119 inittiger(cs);
120 clear_pending_isac_ints(cs);
121 initisac(cs);
122 /* Reenable all IRQ */
123 cs->writeisac(cs, ISAC_MASK, 0);
124 return(0);
125 case CARD_TEST:
126 return(0);
128 return(0);
131 static struct pci_dev *dev_netjet __initdata = NULL;
133 __initfunc(int
134 setup_netjet_s(struct IsdnCard *card))
136 int bytecnt;
137 struct IsdnCardState *cs = card->cs;
138 char tmp[64];
139 long flags;
140 #if CONFIG_PCI
141 #endif
142 #ifdef __BIG_ENDIAN
143 #error "not running on big endian machines now"
144 #endif
145 strcpy(tmp, NETjet_S_revision);
146 printk(KERN_INFO "HiSax: Traverse Tech. NETjet-S driver Rev. %s\n", HiSax_getrev(tmp));
147 if (cs->typ != ISDN_CTYPE_NETJET_S)
148 return(0);
149 test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
151 for ( ;; )
154 #if CONFIG_PCI
156 if (!pci_present()) {
157 printk(KERN_ERR "Netjet: no PCI bus present\n");
158 return(0);
160 if ((dev_netjet = pci_find_device(PCI_VENDOR_ID_TIGERJET,
161 PCI_DEVICE_ID_TIGERJET_300, dev_netjet))) {
162 if (pci_enable_device(dev_netjet))
163 return(0);
164 cs->irq = dev_netjet->irq;
165 if (!cs->irq) {
166 printk(KERN_WARNING "NETjet-S: No IRQ for PCI card found\n");
167 return(0);
169 cs->hw.njet.base = pci_resource_start(dev_netjet, 0);
170 if (!cs->hw.njet.base) {
171 printk(KERN_WARNING "NETjet-S: No IO-Adr for PCI card found\n");
172 return(0);
174 } else {
175 printk(KERN_WARNING "NETjet-S: No PCI card found\n");
176 return(0);
179 cs->hw.njet.auxa = cs->hw.njet.base + NETJET_AUXDATA;
180 cs->hw.njet.isac = cs->hw.njet.base | NETJET_ISAC_OFF;
182 save_flags(flags);
183 sti();
185 cs->hw.njet.ctrl_reg = 0xff; /* Reset On */
186 byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg);
188 set_current_state(TASK_UNINTERRUPTIBLE);
189 schedule_timeout((10*HZ)/1000); /* Timeout 10ms */
191 cs->hw.njet.ctrl_reg = 0x00; /* Reset Off and status read clear */
192 byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg);
194 set_current_state(TASK_UNINTERRUPTIBLE);
195 schedule_timeout((10*HZ)/1000); /* Timeout 10ms */
197 restore_flags(flags);
199 cs->hw.njet.auxd = 0xC0;
200 cs->hw.njet.dmactrl = 0;
202 byteout(cs->hw.njet.base + NETJET_AUXCTRL, ~NETJET_ISACIRQ);
203 byteout(cs->hw.njet.base + NETJET_IRQMASK1, NETJET_ISACIRQ);
204 byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
206 switch ( ( ( NETjet_ReadIC( cs, ISAC_RBCH ) >> 5 ) & 3 ) )
208 case 0 :
209 break;
211 case 3 :
212 printk( KERN_WARNING "NETjet-S: NETspider-U PCI card found\n" );
213 continue;
215 default :
216 printk( KERN_WARNING "NETjet-S: No PCI card found\n" );
217 return 0;
219 break;
221 #else
223 printk(KERN_WARNING "NETjet-S: NO_PCI_BIOS\n");
224 printk(KERN_WARNING "NETjet-S: unable to config NETJET-S PCI\n");
225 return (0);
227 #endif /* CONFIG_PCI */
229 bytecnt = 256;
231 printk(KERN_INFO
232 "NETjet-S: PCI card configured at 0x%x IRQ %d\n",
233 cs->hw.njet.base, cs->irq);
234 if (check_region(cs->hw.njet.base, bytecnt)) {
235 printk(KERN_WARNING
236 "HiSax: %s config port %x-%x already in use\n",
237 CardType[card->typ],
238 cs->hw.njet.base,
239 cs->hw.njet.base + bytecnt);
240 return (0);
241 } else {
242 request_region(cs->hw.njet.base, bytecnt, "netjet-s isdn");
244 reset_netjet_s(cs);
245 cs->readisac = &NETjet_ReadIC;
246 cs->writeisac = &NETjet_WriteIC;
247 cs->readisacfifo = &NETjet_ReadICfifo;
248 cs->writeisacfifo = &NETjet_WriteICfifo;
249 cs->BC_Read_Reg = &dummyrr;
250 cs->BC_Write_Reg = &dummywr;
251 cs->BC_Send_Data = &netjet_fill_dma;
252 cs->cardmsg = &NETjet_S_card_msg;
253 cs->irq_func = &netjet_s_interrupt;
254 cs->irq_flags |= SA_SHIRQ;
255 ISACVersion(cs, "NETjet-S:");
256 return (1);