OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [uclinux/] [uClinux-2.0.x/] [drivers/] [isdn/] [hisax/] [netjet.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 199 simons
/* $Id: netjet.c,v 1.1.1.1 2001-09-10 07:44:18 simons Exp $
2
 
3
 * netjet.c     low level stuff for Traverse Technologie NETJet ISDN cards
4
 *
5
 * Author     Karsten Keil (keil@isdn4linux.de)
6
 *
7
 * Thanks to Traverse Technologie Australia for documents and informations
8
 *
9
 *
10
 * $Log: not supported by cvs2svn $
11
 * Revision 1.1.1.1  2001/07/02 17:58:32  simons
12
 * Initial revision
13
 *
14
 * Revision 1.1.2.10  1998/11/03 00:07:24  keil
15
 * certification related changes
16
 * fixed logging for smaller stack use
17
 *
18
 * Revision 1.1.2.9  1998/09/30 22:24:02  keil
19
 * Fix missing line in setstack*
20
 *
21
 * Revision 1.1.2.8  1998/09/27 13:06:56  keil
22
 * Apply most changes from 2.1.X (HiSax 3.1)
23
 *
24
 * Revision 1.1.2.7  1998/05/27 18:06:17  keil
25
 * HiSax 3.0
26
 *
27
 * Revision 1.1.2.6  1998/04/08 22:05:23  keil
28
 * Forgot PCI fix
29
 *
30
 * Revision 1.1.2.5  1998/04/08 21:49:29  keil
31
 * New init; fix PCI for more as one card
32
 *
33
 * Revision 1.1.2.4  1998/01/27 22:37:27  keil
34
 * fast io
35
 *
36
 * Revision 1.1.2.3  1997/12/01 09:09:57  keil
37
 * IRQ bit clearing
38
 *
39
 * Revision 1.1.2.2  1997/11/27 12:32:01  keil
40
 * Working netjet driver
41
 *
42
 * Revision 1.1.2.1  1997/11/15 18:58:13  keil
43
 * new card
44
 *
45
 *
46
 */
47
 
48
#define __NO_VERSION__
49
#include <linux/config.h>
50
#include "hisax.h"
51
#include "isac.h"
52
#include "hscx.h"
53
#include "isdnl1.h"
54
#include <linux/pci.h>
55
#include <linux/bios32.h>
56
#include <linux/interrupt.h>
57
#include <linux/ppp_defs.h>
58
 
59
#ifndef bus_to_virt
60
#define bus_to_virt (u_int *)
61
#endif
62
 
63
#ifndef virt_to_bus
64
#define virt_to_bus (u_int)
65
#endif
66
 
67
extern const char *CardType[];
68
 
69
const char *NETjet_revision = "$Revision: 1.1.1.1 $";
70
 
71
#define byteout(addr,val) outb(val,addr)
72
#define bytein(addr) inb(addr)
73
 
74
/* PCI stuff */
75
#define PCI_VENDOR_TRAVERSE_TECH 0xe159
76
#define PCI_NETJET_ID   0x0001
77
 
78
#define NETJET_CTRL     0x00
79
#define NETJET_DMACTRL  0x01
80
#define NETJET_AUXCTRL  0x02
81
#define NETJET_AUXDATA  0x03
82
#define NETJET_IRQMASK0 0x04
83
#define NETJET_IRQMASK1 0x05
84
#define NETJET_IRQSTAT0 0x06
85
#define NETJET_IRQSTAT1 0x07
86
#define NETJET_DMA_READ_START   0x08
87
#define NETJET_DMA_READ_IRQ     0x0c
88
#define NETJET_DMA_READ_END     0x10
89
#define NETJET_DMA_READ_ADR     0x14
90
#define NETJET_DMA_WRITE_START  0x18
91
#define NETJET_DMA_WRITE_IRQ    0x1c
92
#define NETJET_DMA_WRITE_END    0x20
93
#define NETJET_DMA_WRITE_ADR    0x24
94
#define NETJET_PULSE_CNT        0x28
95
 
96
#define NETJET_ISAC_OFF 0xc0
97
#define NETJET_ISACIRQ  0x10
98
#define NETJET_IRQM0_READ       0x0c
99
#define NETJET_IRQM0_READ_1     0x04
100
#define NETJET_IRQM0_READ_2     0x08
101
#define NETJET_IRQM0_WRITE      0x03
102
#define NETJET_IRQM0_WRITE_1    0x01
103
#define NETJET_IRQM0_WRITE_2    0x02
104
 
105
#define NETJET_DMA_SIZE 512
106
 
107
#define HDLC_ZERO_SEARCH 0
108
#define HDLC_FLAG_SEARCH 1
109
#define HDLC_FLAG_FOUND  2
110
#define HDLC_FRAME_FOUND 3
111
#define HDLC_NULL 4
112
#define HDLC_PART 5
113
#define HDLC_FULL 6
114
 
115
#define HDLC_FLAG_VALUE 0x7e
116
 
117
/* Interface functions */
118
 
119
static u_char
120
ReadISAC(struct IsdnCardState *cs, u_char offset)
121
{
122
        long flags;
123
        u_char ret;
124
 
125
        save_flags(flags);
126
        cli();
127
        cs->hw.njet.auxd &= 0xfc;
128
        cs->hw.njet.auxd |= (offset>>4) & 3;
129
        byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
130
        ret = bytein(cs->hw.njet.isac + ((offset & 0xf)<<2));
131
        restore_flags(flags);
132
        return(ret);
133
}
134
 
135
static void
136
WriteISAC(struct IsdnCardState *cs, u_char offset, u_char value)
137
{
138
        long flags;
139
 
140
        save_flags(flags);
141
        cli();
142
        cs->hw.njet.auxd &= 0xfc;
143
        cs->hw.njet.auxd |= (offset>>4) & 3;
144
        byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
145
        byteout(cs->hw.njet.isac + ((offset & 0xf)<<2), value);
146
        restore_flags(flags);
147
}
148
 
149
static void
150
ReadISACfifo(struct IsdnCardState *cs, u_char *data, int size)
151
{
152
        cs->hw.njet.auxd &= 0xfc;
153
        byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
154
        insb(cs->hw.njet.isac, data, size);
155
}
156
 
157
__u16 fcstab[256] =
158
{
159
        0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
160
        0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
161
        0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
162
        0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
163
        0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
164
        0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
165
        0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
166
        0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
167
        0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
168
        0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
169
        0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
170
        0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
171
        0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
172
        0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
173
        0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
174
        0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
175
        0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
176
        0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
177
        0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
178
        0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
179
        0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
180
        0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
181
        0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
182
        0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
183
        0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
184
        0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
185
        0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
186
        0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
187
        0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
188
        0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
189
        0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
190
        0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
191
};
192
 
193
static void
194
WriteISACfifo(struct IsdnCardState *cs, u_char *data, int size)
195
{
196
        cs->hw.njet.auxd &= 0xfc;
197
        byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
198
        outsb(cs->hw.njet.isac, data, size);
199
}
200
 
201
void fill_mem(struct BCState *bcs, u_int *pos, u_int cnt, int chan, u_char fill)
202
{
203
        u_int mask=0x000000ff, val = 0, *p=pos;
204
        u_int i;
205
 
206
        val |= fill;
207
        if (chan) {
208
                val  <<= 8;
209
                mask <<= 8;
210
        }
211
        mask ^= 0xffffffff;
212
        for (i=0; i<cnt; i++) {
213
                *p   &= mask;
214
                *p++ |= val;
215
                if (p > bcs->hw.tiger.s_end)
216
                        p = bcs->hw.tiger.send;
217
        }
218
}
219
 
220
void
221
mode_tiger(struct BCState *bcs, int mode, int bc)
222
{
223
        struct IsdnCardState *cs = bcs->cs;
224
 
225
        if (cs->debug & L1_DEB_HSCX)
226
                debugl1(cs, "Tiger mode %d bchan %d/%d",
227
                        mode, bc, bcs->channel);
228
        bcs->mode = mode;
229
        bcs->channel = bc;
230
        switch (mode) {
231
                case (L1_MODE_NULL):
232
                        fill_mem(bcs, bcs->hw.tiger.send,
233
                                NETJET_DMA_SIZE, bc, 0xff);
234
                        if (cs->debug & L1_DEB_HSCX)
235
                                debugl1(cs, "Tiger stat rec %d/%d send %d",
236
                                        bcs->hw.tiger.r_tot, bcs->hw.tiger.r_err,
237
                                        bcs->hw.tiger.s_tot);
238
                        if ((cs->bcs[0].mode == L1_MODE_NULL) &&
239
                                (cs->bcs[1].mode == L1_MODE_NULL)) {
240
                                cs->hw.njet.dmactrl = 0;
241
                                byteout(cs->hw.njet.base + NETJET_DMACTRL,
242
                                        cs->hw.njet.dmactrl);
243
                                byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0);
244
                        }
245
                        break;
246
                case (L1_MODE_TRANS):
247
                        break;
248
                case (L1_MODE_HDLC):
249
                        fill_mem(bcs, bcs->hw.tiger.send,
250
                                NETJET_DMA_SIZE, bc, 0xff);
251
                        bcs->hw.tiger.r_state = HDLC_ZERO_SEARCH;
252
                        bcs->hw.tiger.r_tot = 0;
253
                        bcs->hw.tiger.r_bitcnt = 0;
254
                        bcs->hw.tiger.r_one = 0;
255
                        bcs->hw.tiger.r_err = 0;
256
                        bcs->hw.tiger.s_tot = 0;
257
                        if (! cs->hw.njet.dmactrl) {
258
                                fill_mem(bcs, bcs->hw.tiger.send,
259
                                        NETJET_DMA_SIZE, !bc, 0xff);
260
                                cs->hw.njet.dmactrl = 1;
261
                                byteout(cs->hw.njet.base + NETJET_DMACTRL,
262
                                        cs->hw.njet.dmactrl);
263
                                byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0x3f);
264
                        }
265
                        bcs->hw.tiger.sendp = bcs->hw.tiger.send;
266
                        bcs->hw.tiger.free = NETJET_DMA_SIZE;
267
                        test_and_set_bit(BC_FLG_EMPTY, &bcs->Flag);
268
                        break;
269
        }
270
        if (cs->debug & L1_DEB_HSCX)
271
                debugl1(cs, "tiger: set %x %x %x  %x/%x  pulse=%d",
272
                        bytein(cs->hw.njet.base + NETJET_DMACTRL),
273
                        bytein(cs->hw.njet.base + NETJET_IRQMASK0),
274
                        bytein(cs->hw.njet.base + NETJET_IRQSTAT0),
275
                        inl(cs->hw.njet.base + NETJET_DMA_READ_ADR),
276
                        inl(cs->hw.njet.base + NETJET_DMA_WRITE_ADR),
277
                        bytein(cs->hw.njet.base + NETJET_PULSE_CNT));
278
}
279
 
280
static u_char dummyrr(struct IsdnCardState *cs, int chan, u_char off)
281
{
282
        return(5);
283
}
284
 
285
static void dummywr(struct IsdnCardState *cs, int chan, u_char off, u_char value)
286
{
287
}
288
 
289
static void printframe(struct IsdnCardState *cs, u_char *buf, int count, char *s) {
290
        char tmp[128];
291
        char *t = tmp;
292
        int i=count,j;
293
        u_char *p = buf;
294
 
295
        t += sprintf(t, "tiger %s(%4d)", s, count);
296
        while (i>0) {
297
                if (i>16)
298
                        j=16;
299
                else
300
                        j=i;
301
                QuickHex(t, p, j);
302
                debugl1(cs, tmp);
303
                p += j;
304
                i -= j;
305
                t = tmp;
306
                t += sprintf(t, "tiger %s      ", s);
307
        }
308
}
309
 
310
#define MAKE_RAW_BYTE for (j=0; j<8; j++) { \
311
                        bitcnt++;\
312
                        s_val >>= 1;\
313
                        if (val & 1) {\
314
                                s_one++;\
315
                                s_val |= 0x80;\
316
                        } else {\
317
                                s_one = 0;\
318
                                s_val &= 0x7f;\
319
                        }\
320
                        if (bitcnt==8) {\
321
                                bcs->hw.tiger.sendbuf[s_cnt++] = s_val;\
322
                                bitcnt = 0;\
323
                        }\
324
                        if (s_one == 5) {\
325
                                s_val >>= 1;\
326
                                s_val &= 0x7f;\
327
                                bitcnt++;\
328
                                s_one = 0;\
329
                        }\
330
                        if (bitcnt==8) {\
331
                                bcs->hw.tiger.sendbuf[s_cnt++] = s_val;\
332
                                bitcnt = 0;\
333
                        }\
334
                        val >>= 1;\
335
                }
336
 
337
static int make_raw_data(struct BCState *bcs) {
338
        register u_int i,s_cnt=0;
339
        register u_char j;
340
        register u_char val;
341
        register u_char s_one = 0;
342
        register u_char s_val = 0;
343
        register u_char bitcnt = 0;
344
        u_int fcs;
345
 
346
        if (!bcs->tx_skb) {
347
                debugl1(bcs->cs, "tiger make_raw: NULL skb");
348
                return(1);
349
        }
350
        bcs->hw.tiger.sendbuf[s_cnt++] = HDLC_FLAG_VALUE;
351
        fcs = PPP_INITFCS;
352
        for (i=0; i<bcs->tx_skb->len; i++) {
353
                val = bcs->tx_skb->data[i];
354
                fcs = PPP_FCS (fcs, val);
355
                MAKE_RAW_BYTE;
356
        }
357
        fcs ^= 0xffff;
358
        val = fcs & 0xff;
359
        MAKE_RAW_BYTE;
360
        val = (fcs>>8) & 0xff;
361
        MAKE_RAW_BYTE;
362
        val = HDLC_FLAG_VALUE;
363
        for (j=0; j<8; j++) {
364
                bitcnt++;
365
                s_val >>= 1;
366
                if (val & 1)
367
                        s_val |= 0x80;
368
                else
369
                        s_val &= 0x7f;
370
                if (bitcnt==8) {
371
                        bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
372
                        bitcnt = 0;
373
                }
374
                val >>= 1;
375
        }
376
        if (bcs->cs->debug & L1_DEB_HSCX)
377
                debugl1(bcs->cs,"tiger make_raw: in %ld out %d.%d",
378
                        bcs->tx_skb->len, s_cnt, bitcnt);
379
        if (bitcnt) {
380
                while (8>bitcnt++) {
381
                        s_val >>= 1;
382
                        s_val |= 0x80;
383
                }
384
                bcs->hw.tiger.sendbuf[s_cnt++] = s_val;
385
        }
386
        bcs->hw.tiger.sendcnt = s_cnt;
387
        bcs->tx_cnt -= bcs->tx_skb->len;
388
        bcs->hw.tiger.sp = bcs->hw.tiger.sendbuf;
389
        return(0);
390
}
391
 
392
static void got_frame(struct BCState *bcs, int count) {
393
        struct sk_buff *skb;
394
 
395
        if (!(skb = dev_alloc_skb(count)))
396
                printk(KERN_WARNING "TIGER: receive out of memory\n");
397
        else {
398
                SET_SKB_FREE(skb);
399
                memcpy(skb_put(skb, count), bcs->hw.tiger.rcvbuf, count);
400
                skb_queue_tail(&bcs->rqueue, skb);
401
        }
402
        bcs->event |= 1 << B_RCVBUFREADY;
403
        queue_task(&bcs->tqueue, &tq_immediate);
404
        mark_bh(IMMEDIATE_BH);
405
 
406
        if (bcs->cs->debug & L1_DEB_RECEIVE_FRAME)
407
                printframe(bcs->cs, bcs->hw.tiger.rcvbuf, count, "rec");
408
}
409
 
410
 
411
 
412
static void read_raw(struct BCState *bcs, u_int *buf, int cnt){
413
        int i;
414
        register u_char j;
415
        register u_char val;
416
        u_int  *pend = bcs->hw.tiger.rec +NETJET_DMA_SIZE -1;
417
        register u_char state = bcs->hw.tiger.r_state;
418
        register u_char r_one = bcs->hw.tiger.r_one;
419
        register u_char r_val = bcs->hw.tiger.r_val;
420
        register u_int bitcnt = bcs->hw.tiger.r_bitcnt;
421
        u_int *p = buf;
422
 
423
        for (i=0;i<cnt;i++) {
424
                val = bcs->channel ? ((*p>>8) & 0xff) : (*p & 0xff);
425
                p++;
426
                if (p > pend)
427
                        p = bcs->hw.tiger.rec;
428
                if (val == 0xff) {
429
                        state = HDLC_ZERO_SEARCH;
430
                        bcs->hw.tiger.r_tot++;
431
                        bitcnt = 0;
432
                        r_one = 0;
433
                        continue;
434
                }
435
                for (j=0;j<8;j++) {
436
                        if (state == HDLC_ZERO_SEARCH) {
437
                                if (val & 1) {
438
                                        r_one++;
439
                                } else {
440
                                        r_one=0;
441
                                        state= HDLC_FLAG_SEARCH;
442
                                        if (bcs->cs->debug & L1_DEB_HSCX)
443
                                                debugl1(bcs->cs,"tiger read_raw: zBit(%d,%d,%d) %x",
444
                                                        bcs->hw.tiger.r_tot,i,j,val);
445
                                }
446
                        } else if (state == HDLC_FLAG_SEARCH) {
447
                                if (val & 1) {
448
                                        r_one++;
449
                                        if (r_one>6) {
450
                                                state=HDLC_ZERO_SEARCH;
451
                                        }
452
                                } else {
453
                                        if (r_one==6) {
454
                                                bitcnt=0;
455
                                                r_val=0;
456
                                                state=HDLC_FLAG_FOUND;
457
                                                if (bcs->cs->debug & L1_DEB_HSCX)
458
                                                        debugl1(bcs->cs,"tiger read_raw: flag(%d,%d,%d) %x",
459
                                                                bcs->hw.tiger.r_tot,i,j,val);
460
                                        }
461
                                        r_one=0;
462
                                }
463
                        } else if (state ==  HDLC_FLAG_FOUND) {
464
                                if (val & 1) {
465
                                        r_one++;
466
                                        if (r_one>6) {
467
                                                state=HDLC_ZERO_SEARCH;
468
                                        } else {
469
                                                r_val >>= 1;
470
                                                r_val |= 0x80;
471
                                                bitcnt++;
472
                                        }
473
                                } else {
474
                                        if (r_one==6) {
475
                                                bitcnt=0;
476
                                                r_val=0;
477
                                                r_one=0;
478
                                                val >>= 1;
479
                                                continue;
480
                                        } else if (r_one!=5) {
481
                                                r_val >>= 1;
482
                                                r_val &= 0x7f;
483
                                                bitcnt++;
484
                                        }
485
                                        r_one=0;
486
                                }
487
                                if ((state != HDLC_ZERO_SEARCH) &&
488
                                        !(bitcnt & 7)) {
489
                                        state=HDLC_FRAME_FOUND;
490
                                        bcs->hw.tiger.r_fcs = PPP_INITFCS;
491
                                        bcs->hw.tiger.rcvbuf[0] = r_val;
492
                                        bcs->hw.tiger.r_fcs = PPP_FCS (bcs->hw.tiger.r_fcs, r_val);
493
                                        if (bcs->cs->debug & L1_DEB_HSCX)
494
                                                debugl1(bcs->cs,"tiger read_raw: byte1(%d,%d,%d) rval %x val %x i %x",
495
                                                        bcs->hw.tiger.r_tot,i,j,r_val,val,
496
                                                        bcs->cs->hw.njet.irqstat0);
497
                                }
498
                        } else if (state ==  HDLC_FRAME_FOUND) {
499
                                if (val & 1) {
500
                                        r_one++;
501
                                        if (r_one>6) {
502
                                                state=HDLC_ZERO_SEARCH;
503
                                                bitcnt=0;
504
                                        } else {
505
                                                r_val >>= 1;
506
                                                r_val |= 0x80;
507
                                                bitcnt++;
508
                                        }
509
                                } else {
510
                                        if (r_one==6) {
511
                                                r_val=0;
512
                                                r_one=0;
513
                                                bitcnt++;
514
                                                if (bitcnt & 7) {
515
                                                        debugl1(bcs->cs, "tiger: frame not byte aligned");
516
                                                        state=HDLC_FLAG_SEARCH;
517
                                                        bcs->hw.tiger.r_err++;
518
                                                } else {
519
                                                        if (bcs->cs->debug & L1_DEB_HSCX)
520
                                                                debugl1(bcs->cs,"tiger frame end(%d,%d): fcs(%x) i %x",
521
                                                                        i,j,bcs->hw.tiger.r_fcs, bcs->cs->hw.njet.irqstat0);
522
                                                        if (bcs->hw.tiger.r_fcs == PPP_GOODFCS) {
523
                                                                got_frame(bcs, (bitcnt>>3)-3);
524
                                                        } else
525
                                                                if (bcs->cs->debug) {
526
                                                                        debugl1(bcs->cs, "tiger FCS error");
527
                                                                        printframe(bcs->cs, bcs->hw.tiger.rcvbuf,
528
                                                                                (bitcnt>>3)-1, "rec");
529
                                                                        bcs->hw.tiger.r_err++;
530
                                                                }
531
                                                        state=HDLC_FLAG_FOUND;
532
                                                }
533
                                                bitcnt=0;
534
                                        } else if (r_one==5) {
535
                                                val >>= 1;
536
                                                r_one=0;
537
                                                continue;
538
                                        } else {
539
                                                r_val >>= 1;
540
                                                r_val &= 0x7f;
541
                                                bitcnt++;
542
                                        }
543
                                        r_one=0;
544
                                }
545
                                if ((state == HDLC_FRAME_FOUND) &&
546
                                        !(bitcnt & 7)) {
547
                                        if ((bitcnt>>3)>=HSCX_BUFMAX) {
548
                                                debugl1(bcs->cs, "tiger: frame to big");
549
                                                r_val=0;
550
                                                state=HDLC_FLAG_SEARCH;
551
                                                bcs->hw.tiger.r_err++;
552
                                        } else {
553
                                                bcs->hw.tiger.rcvbuf[(bitcnt>>3)-1] = r_val;
554
                                                bcs->hw.tiger.r_fcs =
555
                                                        PPP_FCS (bcs->hw.tiger.r_fcs, r_val);
556
                                        }
557
                                }
558
                        }
559
                        val >>= 1;
560
                }
561
                bcs->hw.tiger.r_tot++;
562
        }
563
        bcs->hw.tiger.r_state = state;
564
        bcs->hw.tiger.r_one = r_one;
565
        bcs->hw.tiger.r_val = r_val;
566
        bcs->hw.tiger.r_bitcnt = bitcnt;
567
}
568
 
569
static void read_tiger(struct IsdnCardState *cs) {
570
        u_int *p;
571
        int cnt = NETJET_DMA_SIZE/2;
572
 
573
        if ((cs->hw.njet.irqstat0 & cs->hw.njet.last_is0) & NETJET_IRQM0_READ) {
574
                debugl1(cs,"tiger warn read double dma %x/%x",
575
                        cs->hw.njet.irqstat0, cs->hw.njet.last_is0);
576
                return;
577
        } else {
578
                cs->hw.njet.last_is0 &= ~NETJET_IRQM0_READ;
579
                cs->hw.njet.last_is0 |= (cs->hw.njet.irqstat0 & NETJET_IRQM0_READ);
580
        }
581
        if (cs->hw.njet.irqstat0 & NETJET_IRQM0_READ_1)
582
                p = cs->bcs[0].hw.tiger.rec + NETJET_DMA_SIZE - 1;
583
        else
584
                p = cs->bcs[0].hw.tiger.rec + cnt - 1;
585
        if (cs->bcs[0].mode == L1_MODE_HDLC)
586
                read_raw(cs->bcs, p, cnt);
587
        if (cs->bcs[1].mode == L1_MODE_HDLC)
588
                read_raw(cs->bcs + 1, p, cnt);
589
        cs->hw.njet.irqstat0 &= ~NETJET_IRQM0_READ;
590
}
591
 
592
static void write_raw(struct BCState *bcs, u_int *buf, int cnt);
593
 
594
static void fill_dma(struct BCState *bcs)
595
{
596
        register u_int *p, *sp;
597
        register int cnt;
598
 
599
        if (!bcs->tx_skb)
600
                return;
601
        if (bcs->cs->debug & L1_DEB_HSCX)
602
                debugl1(bcs->cs,"tiger fill_dma1: c%d %4x", bcs->channel,
603
                        bcs->Flag);
604
        if (test_and_set_bit(BC_FLG_BUSY, &bcs->Flag))
605
                return;
606
        if (make_raw_data(bcs))
607
                return;
608
        if (bcs->cs->debug & L1_DEB_HSCX)
609
                debugl1(bcs->cs,"tiger fill_dma2: c%d %4x", bcs->channel,
610
                        bcs->Flag);
611
        if (test_and_clear_bit(BC_FLG_NOFRAME, &bcs->Flag)) {
612
                write_raw(bcs, bcs->hw.tiger.sendp, bcs->hw.tiger.free);
613
        } else if (test_and_clear_bit(BC_FLG_HALF, &bcs->Flag)) {
614
                p = bus_to_virt(inl(bcs->cs->hw.njet.base + NETJET_DMA_READ_ADR));
615
                sp = bcs->hw.tiger.sendp;
616
                if (p == bcs->hw.tiger.s_end)
617
                        p = bcs->hw.tiger.send -1;
618
                if (sp == bcs->hw.tiger.s_end)
619
                        sp = bcs->hw.tiger.send -1;
620
                cnt = p - sp;
621
                if (cnt <0) {
622
                        write_raw(bcs, bcs->hw.tiger.sendp, bcs->hw.tiger.free);
623
                } else {
624
                        p++;
625
                        cnt++;
626
                        if (p > bcs->hw.tiger.s_end)
627
                                p = bcs->hw.tiger.send;
628
                        p++;
629
                        cnt++;
630
                        if (p > bcs->hw.tiger.s_end)
631
                                p = bcs->hw.tiger.send;
632
                        write_raw(bcs, p, bcs->hw.tiger.free - cnt);
633
                }
634
        } else if (test_and_clear_bit(BC_FLG_EMPTY, &bcs->Flag)) {
635
                p = bus_to_virt(inl(bcs->cs->hw.njet.base + NETJET_DMA_READ_ADR));
636
                cnt = bcs->hw.tiger.s_end - p;
637
                if (cnt < 2) {
638
                        p = bcs->hw.tiger.send + 1;
639
                        cnt = NETJET_DMA_SIZE/2 - 2;
640
                } else {
641
                        p++;
642
                        p++;
643
                        if (cnt <= (NETJET_DMA_SIZE/2))
644
                                cnt += NETJET_DMA_SIZE/2;
645
                        cnt--;
646
                        cnt--;
647
                }
648
                write_raw(bcs, p, cnt);
649
        }
650
        if (bcs->cs->debug & L1_DEB_HSCX)
651
                debugl1(bcs->cs,"tiger fill_dma3: c%d %4x", bcs->channel,
652
                        bcs->Flag);
653
}
654
 
655
static void write_raw(struct BCState *bcs, u_int *buf, int cnt) {
656
        u_int mask, val, *p=buf;
657
        u_int i, s_cnt;
658
 
659
        if (cnt <= 0)
660
                return;
661
        if (test_bit(BC_FLG_BUSY, &bcs->Flag)) {
662
                if (bcs->hw.tiger.sendcnt> cnt) {
663
                        s_cnt = cnt;
664
                        bcs->hw.tiger.sendcnt -= cnt;
665
                } else {
666
                        s_cnt = bcs->hw.tiger.sendcnt;
667
                        bcs->hw.tiger.sendcnt = 0;
668
                }
669
                if (bcs->channel)
670
                        mask = 0xffff00ff;
671
                else
672
                        mask = 0xffffff00;
673
                for (i=0; i<s_cnt; i++) {
674
                        val = bcs->channel ? ((bcs->hw.tiger.sp[i] <<8) & 0xff00) :
675
                                (bcs->hw.tiger.sp[i]);
676
                        *p   &= mask;
677
                        *p++ |= val;
678
                        if (p>bcs->hw.tiger.s_end)
679
                                p = bcs->hw.tiger.send;
680
                }
681
                bcs->hw.tiger.s_tot += s_cnt;
682
                if (bcs->cs->debug & L1_DEB_HSCX)
683
                        debugl1(bcs->cs,"tiger write_raw: c%d %x-%x %d/%d %d %x", bcs->channel,
684
                                (u_int)buf, (u_int)p, s_cnt, cnt,
685
                                bcs->hw.tiger.sendcnt, bcs->cs->hw.njet.irqstat0);
686
                if (bcs->cs->debug & L1_DEB_HSCX_FIFO)
687
                        printframe(bcs->cs, bcs->hw.tiger.sp, s_cnt, "snd");
688
                bcs->hw.tiger.sp += s_cnt;
689
                bcs->hw.tiger.sendp = p;
690
                if (!bcs->hw.tiger.sendcnt) {
691
                        if (!bcs->tx_skb) {
692
                                debugl1(bcs->cs,"tiger write_raw: NULL skb s_cnt %d", s_cnt);
693
                        } else {
694
                                if (bcs->st->lli.l1writewakeup &&
695
                                        (PACKET_NOACK != bcs->tx_skb->pkt_type))
696
                                        bcs->st->lli.l1writewakeup(bcs->st, bcs->tx_skb->len);
697
                                dev_kfree_skb(bcs->tx_skb, FREE_WRITE);
698
                                bcs->tx_skb = NULL;
699
                        }
700
                        test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
701
                        bcs->hw.tiger.free = cnt - s_cnt;
702
                        if (bcs->hw.tiger.free > (NETJET_DMA_SIZE/2))
703
                                test_and_set_bit(BC_FLG_HALF, &bcs->Flag);
704
                        else {
705
                                test_and_clear_bit(BC_FLG_HALF, &bcs->Flag);
706
                                test_and_set_bit(BC_FLG_NOFRAME, &bcs->Flag);
707
                        }
708
                        if ((bcs->tx_skb = skb_dequeue(&bcs->squeue))) {
709
                                fill_dma(bcs);
710
                        } else {
711
                                mask ^= 0xffffffff;
712
                                if (s_cnt < cnt) {
713
                                        for (i=s_cnt; i<cnt;i++) {
714
                                                *p++ |= mask;
715
                                                if (p>bcs->hw.tiger.s_end)
716
                                                        p = bcs->hw.tiger.send;
717
                                        }
718
                                        if (bcs->cs->debug & L1_DEB_HSCX)
719
                                                debugl1(bcs->cs, "tiger write_raw: fill rest %d",
720
                                                        cnt - s_cnt);
721
                                }
722
                                bcs->event |= 1 << B_XMTBUFREADY;
723
                                queue_task(&bcs->tqueue, &tq_immediate);
724
                                mark_bh(IMMEDIATE_BH);
725
                        }
726
                }
727
        } else if (test_and_clear_bit(BC_FLG_NOFRAME, &bcs->Flag)) {
728
                test_and_set_bit(BC_FLG_HALF, &bcs->Flag);
729
                fill_mem(bcs, buf, cnt, bcs->channel, 0xff);
730
                bcs->hw.tiger.free += cnt;
731
                if (bcs->cs->debug & L1_DEB_HSCX)
732
                        debugl1(bcs->cs,"tiger write_raw: fill half");
733
        } else if (test_and_clear_bit(BC_FLG_HALF, &bcs->Flag)) {
734
                test_and_set_bit(BC_FLG_EMPTY, &bcs->Flag);
735
                fill_mem(bcs, buf, cnt, bcs->channel, 0xff);
736
                if (bcs->cs->debug & L1_DEB_HSCX)
737
                        debugl1(bcs->cs,"tiger write_raw: fill full");
738
        }
739
}
740
 
741
static void write_tiger(struct IsdnCardState *cs) {
742
        u_int *p, cnt = NETJET_DMA_SIZE/2;
743
 
744
        if ((cs->hw.njet.irqstat0 & cs->hw.njet.last_is0) & NETJET_IRQM0_WRITE) {
745
                debugl1(cs,"tiger warn write double dma %x/%x",
746
                        cs->hw.njet.irqstat0, cs->hw.njet.last_is0);
747
                return;
748
        } else {
749
                cs->hw.njet.last_is0 &= ~NETJET_IRQM0_WRITE;
750
                cs->hw.njet.last_is0 |= (cs->hw.njet.irqstat0 & NETJET_IRQM0_WRITE);
751
        }
752
        if (cs->hw.njet.irqstat0  & NETJET_IRQM0_WRITE_1)
753
                p = cs->bcs[0].hw.tiger.send + NETJET_DMA_SIZE - 1;
754
        else
755
                p = cs->bcs[0].hw.tiger.send + cnt - 1;
756
        if (cs->bcs[0].mode == L1_MODE_HDLC)
757
                write_raw(cs->bcs, p, cnt);
758
        if (cs->bcs[1].mode == L1_MODE_HDLC)
759
                write_raw(cs->bcs + 1, p, cnt);
760
        cs->hw.njet.irqstat0 &= ~NETJET_IRQM0_WRITE;
761
}
762
 
763
static void
764
tiger_l2l1(struct PStack *st, int pr, void *arg)
765
{
766
        struct sk_buff *skb = arg;
767
        long flags;
768
 
769
        switch (pr) {
770
                case (PH_DATA | REQUEST):
771
                        save_flags(flags);
772
                        cli();
773
                        if (st->l1.bcs->tx_skb) {
774
                                skb_queue_tail(&st->l1.bcs->squeue, skb);
775
                                restore_flags(flags);
776
                        } else {
777
                                st->l1.bcs->tx_skb = skb;
778
                                st->l1.bcs->cs->BC_Send_Data(st->l1.bcs);
779
                                restore_flags(flags);
780
                        }
781
                        break;
782
                case (PH_PULL | INDICATION):
783
                        if (st->l1.bcs->tx_skb) {
784
                                printk(KERN_WARNING "tiger_l2l1: this shouldn't happen\n");
785
                                break;
786
                        }
787
                        save_flags(flags);
788
                        cli();
789
                        st->l1.bcs->tx_skb = skb;
790
                        st->l1.bcs->cs->BC_Send_Data(st->l1.bcs);
791
                        restore_flags(flags);
792
                        break;
793
                case (PH_PULL | REQUEST):
794
                        if (!st->l1.bcs->tx_skb) {
795
                                test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
796
                                st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
797
                        } else
798
                                test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
799
                        break;
800
                case (PH_ACTIVATE | REQUEST):
801
                        test_and_set_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
802
                        mode_tiger(st->l1.bcs, st->l1.mode, st->l1.bc);
803
                        l1_msg_b(st, pr, arg);
804
                        break;
805
                case (PH_DEACTIVATE | REQUEST):
806
                        l1_msg_b(st, pr, arg);
807
                        break;
808
                case (PH_DEACTIVATE | CONFIRM):
809
                        test_and_clear_bit(BC_FLG_ACTIV, &st->l1.bcs->Flag);
810
                        test_and_clear_bit(BC_FLG_BUSY, &st->l1.bcs->Flag);
811
                        mode_tiger(st->l1.bcs, 0, st->l1.bc);
812
                        st->l1.l1l2(st, PH_DEACTIVATE | CONFIRM, NULL);
813
                        break;
814
        }
815
}
816
 
817
 
818
void
819
close_tigerstate(struct BCState *bcs)
820
{
821
        mode_tiger(bcs, 0, bcs->channel);
822
        if (test_and_clear_bit(BC_FLG_INIT, &bcs->Flag)) {
823
                if (bcs->hw.tiger.rcvbuf) {
824
                        kfree(bcs->hw.tiger.rcvbuf);
825
                        bcs->hw.tiger.rcvbuf = NULL;
826
                }
827
                if (bcs->hw.tiger.sendbuf) {
828
                        kfree(bcs->hw.tiger.sendbuf);
829
                        bcs->hw.tiger.sendbuf = NULL;
830
                }
831
                discard_queue(&bcs->rqueue);
832
                discard_queue(&bcs->squeue);
833
                if (bcs->tx_skb) {
834
                        dev_kfree_skb(bcs->tx_skb, FREE_WRITE);
835
                        bcs->tx_skb = NULL;
836
                        test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
837
                }
838
        }
839
}
840
 
841
static int
842
open_tigerstate(struct IsdnCardState *cs, struct BCState *bcs)
843
{
844
        if (!test_and_set_bit(BC_FLG_INIT, &bcs->Flag)) {
845
                if (!(bcs->hw.tiger.rcvbuf = kmalloc(HSCX_BUFMAX, GFP_ATOMIC))) {
846
                        printk(KERN_WARNING
847
                               "HiSax: No memory for tiger.rcvbuf\n");
848
                        return (1);
849
                }
850
                if (!(bcs->hw.tiger.sendbuf = kmalloc(RAW_BUFMAX, GFP_ATOMIC))) {
851
                        printk(KERN_WARNING
852
                               "HiSax: No memory for tiger.sendbuf\n");
853
                        return (1);
854
                }
855
                skb_queue_head_init(&bcs->rqueue);
856
                skb_queue_head_init(&bcs->squeue);
857
        }
858
        bcs->tx_skb = NULL;
859
        bcs->hw.tiger.sendcnt = 0;
860
        test_and_clear_bit(BC_FLG_BUSY, &bcs->Flag);
861
        bcs->event = 0;
862
        bcs->tx_cnt = 0;
863
        return (0);
864
}
865
 
866
int
867
setstack_tiger(struct PStack *st, struct BCState *bcs)
868
{
869
        bcs->channel = st->l1.bc;
870
        if (open_tigerstate(st->l1.hardware, bcs))
871
                return (-1);
872
        st->l1.bcs = bcs;
873
        st->l2.l2l1 = tiger_l2l1;
874
        setstack_manager(st);
875
        bcs->st = st;
876
        setstack_l1_B(st);
877
        return (0);
878
}
879
 
880
 
881
__initfunc(void
882
inittiger(struct IsdnCardState *cs))
883
{
884
        if (!(cs->bcs[0].hw.tiger.send = kmalloc(NETJET_DMA_SIZE * sizeof(unsigned int),
885
                GFP_KERNEL | GFP_DMA))) {
886
                printk(KERN_WARNING
887
                       "HiSax: No memory for tiger.send\n");
888
                return;
889
        }
890
        cs->bcs[0].hw.tiger.s_irq = cs->bcs[0].hw.tiger.send + NETJET_DMA_SIZE/2 - 1;
891
        cs->bcs[0].hw.tiger.s_end = cs->bcs[0].hw.tiger.send + NETJET_DMA_SIZE - 1;
892
        cs->bcs[1].hw.tiger.send = cs->bcs[0].hw.tiger.send;
893
        cs->bcs[1].hw.tiger.s_irq = cs->bcs[0].hw.tiger.s_irq;
894
        cs->bcs[1].hw.tiger.s_end = cs->bcs[0].hw.tiger.s_end;
895
 
896
        memset(cs->bcs[0].hw.tiger.send, 0xff, NETJET_DMA_SIZE * sizeof(unsigned int));
897
        debugl1(cs, "tiger: send buf %x - %x", (u_int)cs->bcs[0].hw.tiger.send,
898
                (u_int)(cs->bcs[0].hw.tiger.send + NETJET_DMA_SIZE - 1));
899
        outl(virt_to_bus(cs->bcs[0].hw.tiger.send),
900
                cs->hw.njet.base + NETJET_DMA_READ_START);
901
        outl(virt_to_bus(cs->bcs[0].hw.tiger.s_irq),
902
                cs->hw.njet.base + NETJET_DMA_READ_IRQ);
903
        outl(virt_to_bus(cs->bcs[0].hw.tiger.s_end),
904
                cs->hw.njet.base + NETJET_DMA_READ_END);
905
        if (!(cs->bcs[0].hw.tiger.rec = kmalloc(NETJET_DMA_SIZE * sizeof(unsigned int),
906
                GFP_KERNEL | GFP_DMA))) {
907
                printk(KERN_WARNING
908
                       "HiSax: No memory for tiger.rec\n");
909
                return;
910
        }
911
        debugl1(cs, "tiger: rec buf %x - %x", (u_int)cs->bcs[0].hw.tiger.rec,
912
                (u_int)(cs->bcs[0].hw.tiger.rec + NETJET_DMA_SIZE - 1));
913
        cs->bcs[1].hw.tiger.rec = cs->bcs[0].hw.tiger.rec;
914
        memset(cs->bcs[0].hw.tiger.rec, 0xff, NETJET_DMA_SIZE * sizeof(unsigned int));
915
        outl(virt_to_bus(cs->bcs[0].hw.tiger.rec),
916
                cs->hw.njet.base + NETJET_DMA_WRITE_START);
917
        outl(virt_to_bus(cs->bcs[0].hw.tiger.rec + NETJET_DMA_SIZE/2 - 1),
918
                cs->hw.njet.base + NETJET_DMA_WRITE_IRQ);
919
        outl(virt_to_bus(cs->bcs[0].hw.tiger.rec + NETJET_DMA_SIZE - 1),
920
                cs->hw.njet.base + NETJET_DMA_WRITE_END);
921
        debugl1(cs, "tiger: dmacfg  %x/%x  pulse=%d",
922
                inl(cs->hw.njet.base + NETJET_DMA_WRITE_ADR),
923
                inl(cs->hw.njet.base + NETJET_DMA_READ_ADR),
924
                bytein(cs->hw.njet.base + NETJET_PULSE_CNT));
925
        cs->hw.njet.last_is0 = 0;
926
        cs->bcs[0].BC_SetStack = setstack_tiger;
927
        cs->bcs[1].BC_SetStack = setstack_tiger;
928
        cs->bcs[0].BC_Close = close_tigerstate;
929
        cs->bcs[1].BC_Close = close_tigerstate;
930
}
931
 
932
void
933
releasetiger(struct IsdnCardState *cs)
934
{
935
        if (cs->bcs[0].hw.tiger.send) {
936
                kfree(cs->bcs[0].hw.tiger.send);
937
                cs->bcs[0].hw.tiger.send = NULL;
938
        }
939
        if (cs->bcs[1].hw.tiger.send) {
940
                cs->bcs[1].hw.tiger.send = NULL;
941
        }
942
        if (cs->bcs[0].hw.tiger.rec) {
943
                kfree(cs->bcs[0].hw.tiger.rec);
944
                cs->bcs[0].hw.tiger.rec = NULL;
945
        }
946
        if (cs->bcs[1].hw.tiger.rec) {
947
                cs->bcs[1].hw.tiger.rec = NULL;
948
        }
949
}
950
 
951
static void
952
netjet_interrupt(int intno, void *dev_id, struct pt_regs *regs)
953
{
954
        struct IsdnCardState *cs = dev_id;
955
        u_char val, sval;
956
        long flags;
957
 
958
        if (!cs) {
959
                printk(KERN_WARNING "NETjet: Spurious interrupt!\n");
960
                return;
961
        }
962
        if (!((sval = bytein(cs->hw.njet.base + NETJET_IRQSTAT1)) &
963
                NETJET_ISACIRQ)) {
964
                val = ReadISAC(cs, ISAC_ISTA);
965
                if (cs->debug & L1_DEB_ISAC)
966
                        debugl1(cs, "tiger: i1 %x %x", sval, val);
967
                if (val) {
968
                        isac_interrupt(cs, val);
969
                        WriteISAC(cs, ISAC_MASK, 0xFF);
970
                        WriteISAC(cs, ISAC_MASK, 0x0);
971
                }
972
        }
973
        save_flags(flags);
974
        cli();
975
        if ((sval = bytein(cs->hw.njet.base + NETJET_IRQSTAT0))) {
976
                if (test_and_set_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags)) {
977
                        restore_flags(flags);
978
                        return;
979
                }
980
                cs->hw.njet.irqstat0 = sval;
981
                restore_flags(flags);
982
/*              debugl1(cs, "tiger: ist0 %x  %x %x  %x/%x  pulse=%d",
983
                        sval,
984
                        bytein(cs->hw.njet.base + NETJET_DMACTRL),
985
                        bytein(cs->hw.njet.base + NETJET_IRQMASK0),
986
                        inl(cs->hw.njet.base + NETJET_DMA_READ_ADR),
987
                        inl(cs->hw.njet.base + NETJET_DMA_WRITE_ADR),
988
                        bytein(cs->hw.njet.base + NETJET_PULSE_CNT));
989
*/
990
/*              cs->hw.njet.irqmask0 = ((0x0f & cs->hw.njet.irqstat0) ^ 0x0f) | 0x30;
991
*/              byteout(cs->hw.njet.base + NETJET_IRQSTAT0, cs->hw.njet.irqstat0);
992
/*              byteout(cs->hw.njet.base + NETJET_IRQMASK0, cs->hw.njet.irqmask0);
993
*/              if (cs->hw.njet.irqstat0 & NETJET_IRQM0_READ)
994
                        read_tiger(cs);
995
                if (cs->hw.njet.irqstat0 & NETJET_IRQM0_WRITE)
996
                        write_tiger(cs);
997
                test_and_clear_bit(FLG_LOCK_ATOMIC, &cs->HW_Flags);
998
        } else
999
                restore_flags(flags);
1000
 
1001
/*      if (!testcnt--) {
1002
                cs->hw.njet.dmactrl = 0;
1003
                byteout(cs->hw.njet.base + NETJET_DMACTRL,
1004
                        cs->hw.njet.dmactrl);
1005
                byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0);
1006
        }
1007
*/
1008
}
1009
 
1010
static void
1011
reset_netjet(struct IsdnCardState *cs)
1012
{
1013
        long flags;
1014
 
1015
        save_flags(flags);
1016
        sti();
1017
        cs->hw.njet.ctrl_reg = 0xff;  /* Reset On */
1018
        byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg);
1019
        current->state = TASK_INTERRUPTIBLE;
1020
        current->timeout = jiffies + (10 * HZ) / 1000;  /* Timeout 10ms */
1021
        schedule();
1022
        cs->hw.njet.ctrl_reg = 0x00;  /* Reset Off and status read clear */
1023
        byteout(cs->hw.njet.base + NETJET_CTRL, cs->hw.njet.ctrl_reg);
1024
        current->state = TASK_INTERRUPTIBLE;
1025
        current->timeout = jiffies + (10 * HZ) / 1000;  /* Timeout 10ms */
1026
        schedule();
1027
        restore_flags(flags);
1028
        cs->hw.njet.auxd = 0;
1029
        cs->hw.njet.dmactrl = 0;
1030
        byteout(cs->hw.njet.base + NETJET_AUXCTRL, ~NETJET_ISACIRQ);
1031
        byteout(cs->hw.njet.base + NETJET_IRQMASK1, NETJET_ISACIRQ);
1032
        byteout(cs->hw.njet.auxa, cs->hw.njet.auxd);
1033
}
1034
 
1035
void
1036
release_io_netjet(struct IsdnCardState *cs)
1037
{
1038
        byteout(cs->hw.njet.base + NETJET_IRQMASK0, 0);
1039
        byteout(cs->hw.njet.base + NETJET_IRQMASK1, 0);
1040
        releasetiger(cs);
1041
        release_region(cs->hw.njet.base, 256);
1042
}
1043
 
1044
 
1045
static int
1046
NETjet_card_msg(struct IsdnCardState *cs, int mt, void *arg)
1047
{
1048
        switch (mt) {
1049
                case CARD_RESET:
1050
                        reset_netjet(cs);
1051
                        return(0);
1052
                case CARD_RELEASE:
1053
                        release_io_netjet(cs);
1054
                        return(0);
1055
                case CARD_SETIRQ:
1056
                        return(request_irq(cs->irq, &netjet_interrupt,
1057
                                        I4L_IRQ_FLAG | SA_SHIRQ, "HiSax", cs));
1058
                case CARD_INIT:
1059
                        inittiger(cs);
1060
                        clear_pending_isac_ints(cs);
1061
                        initisac(cs);
1062
                        /* Reenable all IRQ */
1063
                        cs->writeisac(cs, ISAC_MASK, 0);
1064
                        return(0);
1065
                case CARD_TEST:
1066
                        return(0);
1067
        }
1068
        return(0);
1069
}
1070
 
1071
 
1072
 
1073
static  int pci_index __initdata = 0;
1074
 
1075
__initfunc(int
1076
setup_netjet(struct IsdnCard *card))
1077
{
1078
        int bytecnt;
1079
        struct IsdnCardState *cs = card->cs;
1080
        char tmp[64];
1081
#if CONFIG_PCI
1082
        u_char pci_bus, pci_device_fn, pci_irq;
1083
        u_int pci_ioaddr, found;
1084
#endif
1085
 
1086
        strcpy(tmp, NETjet_revision);
1087
        printk(KERN_INFO "HiSax: Traverse Tech. NETjet driver Rev. %s\n", HiSax_getrev(tmp));
1088
        if (cs->typ != ISDN_CTYPE_NETJET)
1089
                return(0);
1090
#if CONFIG_PCI
1091
        found = 0;
1092
        for (; pci_index < 0xff; pci_index++) {
1093
                if (pcibios_find_device(PCI_VENDOR_TRAVERSE_TECH,
1094
                        PCI_NETJET_ID, pci_index, &pci_bus, &pci_device_fn)
1095
                        == PCIBIOS_SUCCESSFUL)
1096
                        found = 1;
1097
                else
1098
                        break;
1099
                /* get IRQ */
1100
                pcibios_read_config_byte(pci_bus, pci_device_fn,
1101
                        PCI_INTERRUPT_LINE, &pci_irq);
1102
 
1103
                /* get IO address */
1104
                pcibios_read_config_dword(pci_bus, pci_device_fn,
1105
                        PCI_BASE_ADDRESS_0, &pci_ioaddr);
1106
                if (found)
1107
                        break;
1108
        }
1109
        if (!found) {
1110
                printk(KERN_WARNING "NETjet: No PCI card found\n");
1111
                return(0);
1112
        }
1113
        pci_index++;
1114
        if (!pci_irq) {
1115
                printk(KERN_WARNING "NETjet: No IRQ for PCI card found\n");
1116
                return(0);
1117
        }
1118
        if (!pci_ioaddr) {
1119
                printk(KERN_WARNING "NETjet: No IO-Adr for PCI card found\n");
1120
                return(0);
1121
        }
1122
        pci_ioaddr &= ~3; /* remove io/mem flag */
1123
        cs->hw.njet.base = pci_ioaddr;
1124
        cs->hw.njet.auxa = pci_ioaddr + NETJET_AUXDATA;
1125
        cs->hw.njet.isac = pci_ioaddr | NETJET_ISAC_OFF;
1126
        cs->irq = pci_irq;
1127
        bytecnt = 256;
1128
#else
1129
        printk(KERN_WARNING "NETjet: NO_PCI_BIOS\n");
1130
        printk(KERN_WARNING "NETjet: unable to config NETJET PCI\n");
1131
        return (0);
1132
#endif /* CONFIG_PCI */
1133
        printk(KERN_INFO
1134
                "NETjet: PCI card configured at 0x%x IRQ %d\n",
1135
                cs->hw.njet.base, cs->irq);
1136
        if (check_region(cs->hw.njet.base, bytecnt)) {
1137
                printk(KERN_WARNING
1138
                       "HiSax: %s config port %x-%x already in use\n",
1139
                       CardType[card->typ],
1140
                       cs->hw.njet.base,
1141
                       cs->hw.njet.base + bytecnt);
1142
                return (0);
1143
        } else {
1144
                request_region(cs->hw.njet.base, bytecnt, "netjet isdn");
1145
        }
1146
        reset_netjet(cs);
1147
        cs->readisac  = &ReadISAC;
1148
        cs->writeisac = &WriteISAC;
1149
        cs->readisacfifo  = &ReadISACfifo;
1150
        cs->writeisacfifo = &WriteISACfifo;
1151
        cs->BC_Read_Reg  = &dummyrr;
1152
        cs->BC_Write_Reg = &dummywr;
1153
        cs->BC_Send_Data = &fill_dma;
1154
        cs->cardmsg = &NETjet_card_msg;
1155
        ISACVersion(cs, "NETjet:");
1156
        return (1);
1157
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.