1#define USE_PCI_CLOCK
2static char rcsid[] =
3"Revision: 3.4.5 Date: 2002/03/07 ";
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215#include <linux/module.h>
216#include <linux/kernel.h>
217#include <linux/mm.h>
218#include <linux/ioport.h>
219#include <linux/pci.h>
220#include <linux/errno.h>
221#include <linux/string.h>
222#include <linux/init.h>
223#include <linux/delay.h>
224#include <linux/net.h>
225#include <linux/skbuff.h>
226#include <linux/if_arp.h>
227#include <linux/netdevice.h>
228#include <linux/spinlock.h>
229#include <linux/if.h>
230
231#include <net/syncppp.h>
232#include <net/arp.h>
233
234#include <asm/io.h>
235#include <asm/uaccess.h>
236
237#include "pc300.h"
238
239#define CPC_LOCK(card,flags) \
240 do { \
241 spin_lock_irqsave(&card->card_lock, flags); \
242 } while (0)
243
244#define CPC_UNLOCK(card,flags) \
245 do { \
246 spin_unlock_irqrestore(&card->card_lock, flags); \
247 } while (0)
248
249#undef PC300_DEBUG_PCI
250#undef PC300_DEBUG_INTR
251#undef PC300_DEBUG_TX
252#undef PC300_DEBUG_RX
253#undef PC300_DEBUG_OTHER
254
255static struct pci_device_id cpc_pci_dev_id[] __devinitdata = {
256
257 {0x120e, 0x300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x300},
258
259 {0x120e, 0x301, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x301},
260
261 {0x120e, 0x310, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x310},
262
263 {0x120e, 0x311, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x311},
264
265 {0x120e, 0x320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x320},
266
267 {0x120e, 0x321, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x321},
268
269 {0,},
270};
271MODULE_DEVICE_TABLE(pci, cpc_pci_dev_id);
272
273#ifndef cpc_min
274#define cpc_min(a,b) (((a)<(b))?(a):(b))
275#endif
276#ifndef cpc_max
277#define cpc_max(a,b) (((a)>(b))?(a):(b))
278#endif
279
280
281static void tx_dma_buf_pt_init(pc300_t *, int);
282static void tx_dma_buf_init(pc300_t *, int);
283static void rx_dma_buf_pt_init(pc300_t *, int);
284static void rx_dma_buf_init(pc300_t *, int);
285static void tx_dma_buf_check(pc300_t *, int);
286static void rx_dma_buf_check(pc300_t *, int);
287static irqreturn_t cpc_intr(int, void *);
288static struct net_device_stats *cpc_get_stats(struct net_device *);
289static int clock_rate_calc(uclong, uclong, int *);
290static uclong detect_ram(pc300_t *);
291static void plx_init(pc300_t *);
292static void cpc_trace(struct net_device *, struct sk_buff *, char);
293static int cpc_attach(struct net_device *, unsigned short, unsigned short);
294static int cpc_close(struct net_device *dev);
295
296#ifdef CONFIG_PC300_MLPPP
297void cpc_tty_init(pc300dev_t * dev);
298void cpc_tty_unregister_service(pc300dev_t * pc300dev);
299void cpc_tty_receive(pc300dev_t * pc300dev);
300void cpc_tty_trigger_poll(pc300dev_t * pc300dev);
301void cpc_tty_reset_var(void);
302#endif
303
304
305
306
307static void tx_dma_buf_pt_init(pc300_t * card, int ch)
308{
309 int i;
310 int ch_factor = ch * N_DMA_TX_BUF;
311 volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase
312 + DMA_TX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
313
314 for (i = 0; i < N_DMA_TX_BUF; i++, ptdescr++) {
315 cpc_writel(&ptdescr->next, (uclong) (DMA_TX_BD_BASE +
316 (ch_factor + ((i + 1) & (N_DMA_TX_BUF - 1))) * sizeof(pcsca_bd_t)));
317 cpc_writel(&ptdescr->ptbuf,
318 (uclong) (DMA_TX_BASE + (ch_factor + i) * BD_DEF_LEN));
319 }
320}
321
322static void tx_dma_buf_init(pc300_t * card, int ch)
323{
324 int i;
325 int ch_factor = ch * N_DMA_TX_BUF;
326 volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase
327 + DMA_TX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
328
329 for (i = 0; i < N_DMA_TX_BUF; i++, ptdescr++) {
330 memset_io(ptdescr, 0, sizeof(pcsca_bd_t));
331 cpc_writew(&ptdescr->len, 0);
332 cpc_writeb(&ptdescr->status, DST_OSB);
333 }
334 tx_dma_buf_pt_init(card, ch);
335}
336
337static void rx_dma_buf_pt_init(pc300_t * card, int ch)
338{
339 int i;
340 int ch_factor = ch * N_DMA_RX_BUF;
341 volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase
342 + DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
343
344 for (i = 0; i < N_DMA_RX_BUF; i++, ptdescr++) {
345 cpc_writel(&ptdescr->next, (uclong) (DMA_RX_BD_BASE +
346 (ch_factor + ((i + 1) & (N_DMA_RX_BUF - 1))) * sizeof(pcsca_bd_t)));
347 cpc_writel(&ptdescr->ptbuf,
348 (uclong) (DMA_RX_BASE + (ch_factor + i) * BD_DEF_LEN));
349 }
350}
351
352static void rx_dma_buf_init(pc300_t * card, int ch)
353{
354 int i;
355 int ch_factor = ch * N_DMA_RX_BUF;
356 volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase
357 + DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
358
359 for (i = 0; i < N_DMA_RX_BUF; i++, ptdescr++) {
360 memset_io(ptdescr, 0, sizeof(pcsca_bd_t));
361 cpc_writew(&ptdescr->len, 0);
362 cpc_writeb(&ptdescr->status, 0);
363 }
364 rx_dma_buf_pt_init(card, ch);
365}
366
367static void tx_dma_buf_check(pc300_t * card, int ch)
368{
369 volatile pcsca_bd_t __iomem *ptdescr;
370 int i;
371 ucshort first_bd = card->chan[ch].tx_first_bd;
372 ucshort next_bd = card->chan[ch].tx_next_bd;
373
374 printk("#CH%d: f_bd = %d(0x%08zx), n_bd = %d(0x%08zx)\n", ch,
375 first_bd, TX_BD_ADDR(ch, first_bd),
376 next_bd, TX_BD_ADDR(ch, next_bd));
377 for (i = first_bd,
378 ptdescr = (card->hw.rambase + TX_BD_ADDR(ch, first_bd));
379 i != ((next_bd + 1) & (N_DMA_TX_BUF - 1));
380 i = (i + 1) & (N_DMA_TX_BUF - 1),
381 ptdescr = (card->hw.rambase + TX_BD_ADDR(ch, i))) {
382 printk("\n CH%d TX%d: next=0x%x, ptbuf=0x%x, ST=0x%x, len=%d",
383 ch, i, cpc_readl(&ptdescr->next),
384 cpc_readl(&ptdescr->ptbuf),
385 cpc_readb(&ptdescr->status), cpc_readw(&ptdescr->len));
386 }
387 printk("\n");
388}
389
390#ifdef PC300_DEBUG_OTHER
391
392static void tx1_dma_buf_check(pc300_t * card, int ch)
393{
394 volatile pcsca_bd_t __iomem *ptdescr;
395 int i;
396 ucshort first_bd = card->chan[ch].tx_first_bd;
397 ucshort next_bd = card->chan[ch].tx_next_bd;
398 uclong scabase = card->hw.scabase;
399
400 printk ("\nnfree_tx_bd = %d \n", card->chan[ch].nfree_tx_bd);
401 printk("#CH%d: f_bd = %d(0x%08x), n_bd = %d(0x%08x)\n", ch,
402 first_bd, TX_BD_ADDR(ch, first_bd),
403 next_bd, TX_BD_ADDR(ch, next_bd));
404 printk("TX_CDA=0x%08x, TX_EDA=0x%08x\n",
405 cpc_readl(scabase + DTX_REG(CDAL, ch)),
406 cpc_readl(scabase + DTX_REG(EDAL, ch)));
407 for (i = 0; i < N_DMA_TX_BUF; i++) {
408 ptdescr = (card->hw.rambase + TX_BD_ADDR(ch, i));
409 printk("\n CH%d TX%d: next=0x%x, ptbuf=0x%x, ST=0x%x, len=%d",
410 ch, i, cpc_readl(&ptdescr->next),
411 cpc_readl(&ptdescr->ptbuf),
412 cpc_readb(&ptdescr->status), cpc_readw(&ptdescr->len));
413 }
414 printk("\n");
415}
416#endif
417
418static void rx_dma_buf_check(pc300_t * card, int ch)
419{
420 volatile pcsca_bd_t __iomem *ptdescr;
421 int i;
422 ucshort first_bd = card->chan[ch].rx_first_bd;
423 ucshort last_bd = card->chan[ch].rx_last_bd;
424 int ch_factor;
425
426 ch_factor = ch * N_DMA_RX_BUF;
427 printk("#CH%d: f_bd = %d, l_bd = %d\n", ch, first_bd, last_bd);
428 for (i = 0, ptdescr = (card->hw.rambase +
429 DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
430 i < N_DMA_RX_BUF; i++, ptdescr++) {
431 if (cpc_readb(&ptdescr->status) & DST_OSB)
432 printk ("\n CH%d RX%d: next=0x%x, ptbuf=0x%x, ST=0x%x, len=%d",
433 ch, i, cpc_readl(&ptdescr->next),
434 cpc_readl(&ptdescr->ptbuf),
435 cpc_readb(&ptdescr->status),
436 cpc_readw(&ptdescr->len));
437 }
438 printk("\n");
439}
440
441static int dma_get_rx_frame_size(pc300_t * card, int ch)
442{
443 volatile pcsca_bd_t __iomem *ptdescr;
444 ucshort first_bd = card->chan[ch].rx_first_bd;
445 int rcvd = 0;
446 volatile ucchar status;
447
448 ptdescr = (card->hw.rambase + RX_BD_ADDR(ch, first_bd));
449 while ((status = cpc_readb(&ptdescr->status)) & DST_OSB) {
450 rcvd += cpc_readw(&ptdescr->len);
451 first_bd = (first_bd + 1) & (N_DMA_RX_BUF - 1);
452 if ((status & DST_EOM) || (first_bd == card->chan[ch].rx_last_bd)) {
453
454
455 return (rcvd);
456 }
457 ptdescr = (card->hw.rambase + cpc_readl(&ptdescr->next));
458 }
459 return (-1);
460}
461
462
463
464
465
466static int dma_buf_write(pc300_t * card, int ch, ucchar * ptdata, int len)
467{
468 int i, nchar;
469 volatile pcsca_bd_t __iomem *ptdescr;
470 int tosend = len;
471 ucchar nbuf = ((len - 1) / BD_DEF_LEN) + 1;
472
473 if (nbuf >= card->chan[ch].nfree_tx_bd) {
474 return -ENOMEM;
475 }
476
477 for (i = 0; i < nbuf; i++) {
478 ptdescr = (card->hw.rambase +
479 TX_BD_ADDR(ch, card->chan[ch].tx_next_bd));
480 nchar = cpc_min(BD_DEF_LEN, tosend);
481 if (cpc_readb(&ptdescr->status) & DST_OSB) {
482 memcpy_toio((card->hw.rambase + cpc_readl(&ptdescr->ptbuf)),
483 &ptdata[len - tosend], nchar);
484 cpc_writew(&ptdescr->len, nchar);
485 card->chan[ch].nfree_tx_bd--;
486 if ((i + 1) == nbuf) {
487
488 cpc_writeb(&ptdescr->status, DST_EOM);
489 } else {
490 cpc_writeb(&ptdescr->status, 0);
491 }
492 } else {
493 return -ENOMEM;
494 }
495 tosend -= nchar;
496 card->chan[ch].tx_next_bd =
497 (card->chan[ch].tx_next_bd + 1) & (N_DMA_TX_BUF - 1);
498 }
499
500 return 0;
501}
502
503
504
505
506
507static int dma_buf_read(pc300_t * card, int ch, struct sk_buff *skb)
508{
509 int nchar;
510 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
511 volatile pcsca_bd_t __iomem *ptdescr;
512 int rcvd = 0;
513 volatile ucchar status;
514
515 ptdescr = (card->hw.rambase +
516 RX_BD_ADDR(ch, chan->rx_first_bd));
517 while ((status = cpc_readb(&ptdescr->status)) & DST_OSB) {
518 nchar = cpc_readw(&ptdescr->len);
519 if ((status & (DST_OVR | DST_CRC | DST_RBIT | DST_SHRT | DST_ABT))
520 || (nchar > BD_DEF_LEN)) {
521
522 if (nchar > BD_DEF_LEN)
523 status |= DST_RBIT;
524 rcvd = -status;
525
526 while (chan->rx_first_bd != chan->rx_last_bd) {
527 cpc_writeb(&ptdescr->status, 0);
528 chan->rx_first_bd = (chan->rx_first_bd+1) & (N_DMA_RX_BUF-1);
529 if (status & DST_EOM)
530 break;
531 ptdescr = (card->hw.rambase +
532 cpc_readl(&ptdescr->next));
533 status = cpc_readb(&ptdescr->status);
534 }
535 break;
536 }
537 if (nchar != 0) {
538 if (skb) {
539 memcpy_fromio(skb_put(skb, nchar),
540 (card->hw.rambase+cpc_readl(&ptdescr->ptbuf)),nchar);
541 }
542 rcvd += nchar;
543 }
544 cpc_writeb(&ptdescr->status, 0);
545 cpc_writeb(&ptdescr->len, 0);
546 chan->rx_first_bd = (chan->rx_first_bd + 1) & (N_DMA_RX_BUF - 1);
547
548 if (status & DST_EOM)
549 break;
550
551 ptdescr = (card->hw.rambase + cpc_readl(&ptdescr->next));
552 }
553
554 if (rcvd != 0) {
555
556 chan->rx_last_bd = (chan->rx_first_bd - 1) & (N_DMA_RX_BUF - 1);
557
558 cpc_writel(card->hw.scabase + DRX_REG(EDAL, ch),
559 RX_BD_ADDR(ch, chan->rx_last_bd));
560 }
561 return (rcvd);
562}
563
564static void tx_dma_stop(pc300_t * card, int ch)
565{
566 void __iomem *scabase = card->hw.scabase;
567 ucchar drr_ena_bit = 1 << (5 + 2 * ch);
568 ucchar drr_rst_bit = 1 << (1 + 2 * ch);
569
570
571 cpc_writeb(scabase + DRR, drr_ena_bit);
572 cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit);
573}
574
575static void rx_dma_stop(pc300_t * card, int ch)
576{
577 void __iomem *scabase = card->hw.scabase;
578 ucchar drr_ena_bit = 1 << (4 + 2 * ch);
579 ucchar drr_rst_bit = 1 << (2 * ch);
580
581
582 cpc_writeb(scabase + DRR, drr_ena_bit);
583 cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit);
584}
585
586static void rx_dma_start(pc300_t * card, int ch)
587{
588 void __iomem *scabase = card->hw.scabase;
589 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
590
591
592 cpc_writel(scabase + DRX_REG(CDAL, ch),
593 RX_BD_ADDR(ch, chan->rx_first_bd));
594 if (cpc_readl(scabase + DRX_REG(CDAL,ch)) !=
595 RX_BD_ADDR(ch, chan->rx_first_bd)) {
596 cpc_writel(scabase + DRX_REG(CDAL, ch),
597 RX_BD_ADDR(ch, chan->rx_first_bd));
598 }
599 cpc_writel(scabase + DRX_REG(EDAL, ch),
600 RX_BD_ADDR(ch, chan->rx_last_bd));
601 cpc_writew(scabase + DRX_REG(BFLL, ch), BD_DEF_LEN);
602 cpc_writeb(scabase + DSR_RX(ch), DSR_DE);
603 if (!(cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) {
604 cpc_writeb(scabase + DSR_RX(ch), DSR_DE);
605 }
606}
607
608
609
610
611static void falc_issue_cmd(pc300_t * card, int ch, ucchar cmd)
612{
613 void __iomem *falcbase = card->hw.falcbase;
614 unsigned long i = 0;
615
616 while (cpc_readb(falcbase + F_REG(SIS, ch)) & SIS_CEC) {
617 if (i++ >= PC300_FALC_MAXLOOP) {
618 printk("%s: FALC command locked(cmd=0x%x).\n",
619 card->chan[ch].d.name, cmd);
620 break;
621 }
622 }
623 cpc_writeb(falcbase + F_REG(CMDR, ch), cmd);
624}
625
626static void falc_intr_enable(pc300_t * card, int ch)
627{
628 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
629 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
630 falc_t *pfalc = (falc_t *) & chan->falc;
631 void __iomem *falcbase = card->hw.falcbase;
632
633
634 cpc_writeb(falcbase + F_REG(IPC, ch),
635 cpc_readb(falcbase + F_REG(IPC, ch)) & ~IPC_IC0);
636
637 cpc_writeb(falcbase + F_REG(FMR1, ch),
638 cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_ECM);
639
640 cpc_writeb(falcbase + F_REG(IMR3, ch),
641 cpc_readb(falcbase + F_REG(IMR3, ch)) & ~(IMR3_SEC | IMR3_ES));
642 if (conf->fr_mode == PC300_FR_UNFRAMED) {
643 cpc_writeb(falcbase + F_REG(IMR4, ch),
644 cpc_readb(falcbase + F_REG(IMR4, ch)) & ~(IMR4_LOS));
645 } else {
646 cpc_writeb(falcbase + F_REG(IMR4, ch),
647 cpc_readb(falcbase + F_REG(IMR4, ch)) &
648 ~(IMR4_LFA | IMR4_AIS | IMR4_LOS | IMR4_SLIP));
649 }
650 if (conf->media == IF_IFACE_T1) {
651 cpc_writeb(falcbase + F_REG(IMR3, ch),
652 cpc_readb(falcbase + F_REG(IMR3, ch)) & ~IMR3_LLBSC);
653 } else {
654 cpc_writeb(falcbase + F_REG(IPC, ch),
655 cpc_readb(falcbase + F_REG(IPC, ch)) | IPC_SCI);
656 if (conf->fr_mode == PC300_FR_UNFRAMED) {
657 cpc_writeb(falcbase + F_REG(IMR2, ch),
658 cpc_readb(falcbase + F_REG(IMR2, ch)) & ~(IMR2_LOS));
659 } else {
660 cpc_writeb(falcbase + F_REG(IMR2, ch),
661 cpc_readb(falcbase + F_REG(IMR2, ch)) &
662 ~(IMR2_FAR | IMR2_LFA | IMR2_AIS | IMR2_LOS));
663 if (pfalc->multiframe_mode) {
664 cpc_writeb(falcbase + F_REG(IMR2, ch),
665 cpc_readb(falcbase + F_REG(IMR2, ch)) &
666 ~(IMR2_T400MS | IMR2_MFAR));
667 } else {
668 cpc_writeb(falcbase + F_REG(IMR2, ch),
669 cpc_readb(falcbase + F_REG(IMR2, ch)) |
670 IMR2_T400MS | IMR2_MFAR);
671 }
672 }
673 }
674}
675
676static void falc_open_timeslot(pc300_t * card, int ch, int timeslot)
677{
678 void __iomem *falcbase = card->hw.falcbase;
679 ucchar tshf = card->chan[ch].falc.offset;
680
681 cpc_writeb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch),
682 cpc_readb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch)) &
683 ~(0x80 >> ((timeslot - tshf) & 0x07)));
684 cpc_writeb(falcbase + F_REG((TTR1 + timeslot / 8), ch),
685 cpc_readb(falcbase + F_REG((TTR1 + timeslot / 8), ch)) |
686 (0x80 >> (timeslot & 0x07)));
687 cpc_writeb(falcbase + F_REG((RTR1 + timeslot / 8), ch),
688 cpc_readb(falcbase + F_REG((RTR1 + timeslot / 8), ch)) |
689 (0x80 >> (timeslot & 0x07)));
690}
691
692static void falc_close_timeslot(pc300_t * card, int ch, int timeslot)
693{
694 void __iomem *falcbase = card->hw.falcbase;
695 ucchar tshf = card->chan[ch].falc.offset;
696
697 cpc_writeb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch),
698 cpc_readb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch)) |
699 (0x80 >> ((timeslot - tshf) & 0x07)));
700 cpc_writeb(falcbase + F_REG((TTR1 + timeslot / 8), ch),
701 cpc_readb(falcbase + F_REG((TTR1 + timeslot / 8), ch)) &
702 ~(0x80 >> (timeslot & 0x07)));
703 cpc_writeb(falcbase + F_REG((RTR1 + timeslot / 8), ch),
704 cpc_readb(falcbase + F_REG((RTR1 + timeslot / 8), ch)) &
705 ~(0x80 >> (timeslot & 0x07)));
706}
707
708static void falc_close_all_timeslots(pc300_t * card, int ch)
709{
710 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
711 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
712 void __iomem *falcbase = card->hw.falcbase;
713
714 cpc_writeb(falcbase + F_REG(ICB1, ch), 0xff);
715 cpc_writeb(falcbase + F_REG(TTR1, ch), 0);
716 cpc_writeb(falcbase + F_REG(RTR1, ch), 0);
717 cpc_writeb(falcbase + F_REG(ICB2, ch), 0xff);
718 cpc_writeb(falcbase + F_REG(TTR2, ch), 0);
719 cpc_writeb(falcbase + F_REG(RTR2, ch), 0);
720 cpc_writeb(falcbase + F_REG(ICB3, ch), 0xff);
721 cpc_writeb(falcbase + F_REG(TTR3, ch), 0);
722 cpc_writeb(falcbase + F_REG(RTR3, ch), 0);
723 if (conf->media == IF_IFACE_E1) {
724 cpc_writeb(falcbase + F_REG(ICB4, ch), 0xff);
725 cpc_writeb(falcbase + F_REG(TTR4, ch), 0);
726 cpc_writeb(falcbase + F_REG(RTR4, ch), 0);
727 }
728}
729
730static void falc_open_all_timeslots(pc300_t * card, int ch)
731{
732 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
733 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
734 void __iomem *falcbase = card->hw.falcbase;
735
736 cpc_writeb(falcbase + F_REG(ICB1, ch), 0);
737 if (conf->fr_mode == PC300_FR_UNFRAMED) {
738 cpc_writeb(falcbase + F_REG(TTR1, ch), 0xff);
739 cpc_writeb(falcbase + F_REG(RTR1, ch), 0xff);
740 } else {
741
742 cpc_writeb(falcbase + F_REG(TTR1, ch), 0x7f);
743 cpc_writeb(falcbase + F_REG(RTR1, ch), 0x7f);
744 }
745 cpc_writeb(falcbase + F_REG(ICB2, ch), 0);
746 cpc_writeb(falcbase + F_REG(TTR2, ch), 0xff);
747 cpc_writeb(falcbase + F_REG(RTR2, ch), 0xff);
748 cpc_writeb(falcbase + F_REG(ICB3, ch), 0);
749 cpc_writeb(falcbase + F_REG(TTR3, ch), 0xff);
750 cpc_writeb(falcbase + F_REG(RTR3, ch), 0xff);
751 if (conf->media == IF_IFACE_E1) {
752 cpc_writeb(falcbase + F_REG(ICB4, ch), 0);
753 cpc_writeb(falcbase + F_REG(TTR4, ch), 0xff);
754 cpc_writeb(falcbase + F_REG(RTR4, ch), 0xff);
755 } else {
756 cpc_writeb(falcbase + F_REG(ICB4, ch), 0xff);
757 cpc_writeb(falcbase + F_REG(TTR4, ch), 0x80);
758 cpc_writeb(falcbase + F_REG(RTR4, ch), 0x80);
759 }
760}
761
762static void falc_init_timeslot(pc300_t * card, int ch)
763{
764 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
765 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
766 falc_t *pfalc = (falc_t *) & chan->falc;
767 int tslot;
768
769 for (tslot = 0; tslot < pfalc->num_channels; tslot++) {
770 if (conf->tslot_bitmap & (1 << tslot)) {
771
772 falc_open_timeslot(card, ch, tslot + 1);
773 } else {
774
775 falc_close_timeslot(card, ch, tslot + 1);
776 }
777 }
778}
779
780static void falc_enable_comm(pc300_t * card, int ch)
781{
782 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
783 falc_t *pfalc = (falc_t *) & chan->falc;
784
785 if (pfalc->full_bandwidth) {
786 falc_open_all_timeslots(card, ch);
787 } else {
788 falc_init_timeslot(card, ch);
789 }
790
791 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
792 cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) &
793 ~((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2 * ch)));
794}
795
796static void falc_disable_comm(pc300_t * card, int ch)
797{
798 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
799 falc_t *pfalc = (falc_t *) & chan->falc;
800
801 if (pfalc->loop_active != 2) {
802 falc_close_all_timeslots(card, ch);
803 }
804
805 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
806 cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) |
807 ((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2 * ch)));
808}
809
810static void falc_init_t1(pc300_t * card, int ch)
811{
812 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
813 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
814 falc_t *pfalc = (falc_t *) & chan->falc;
815 void __iomem *falcbase = card->hw.falcbase;
816 ucchar dja = (ch ? (LIM2_DJA2 | LIM2_DJA1) : 0);
817
818
819 cpc_writeb(falcbase + F_REG(FMR1, ch), FMR1_PMOD);
820
821
822 udelay(20);
823
824
825 cpc_writeb(falcbase + F_REG(SIC1, ch), SIC1_XBS0);
826
827
828 if (conf->phys_settings.clock_type == CLOCK_INT) {
829 cpc_writeb(falcbase + F_REG(LIM0, ch),
830 cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_MAS);
831 } else {
832 cpc_writeb(falcbase + F_REG(LIM0, ch),
833 cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_MAS);
834 cpc_writeb(falcbase + F_REG(LOOP, ch),
835 cpc_readb(falcbase + F_REG(LOOP, ch)) & ~LOOP_RTM);
836 }
837
838 cpc_writeb(falcbase + F_REG(IPC, ch), IPC_SCI);
839 cpc_writeb(falcbase + F_REG(FMR0, ch),
840 cpc_readb(falcbase + F_REG(FMR0, ch)) &
841 ~(FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1));
842
843 switch (conf->lcode) {
844 case PC300_LC_AMI:
845 cpc_writeb(falcbase + F_REG(FMR0, ch),
846 cpc_readb(falcbase + F_REG(FMR0, ch)) |
847 FMR0_XC1 | FMR0_RC1);
848
849 cpc_writeb(falcbase + F_REG(CCB1, ch), 0xff);
850 cpc_writeb(falcbase + F_REG(CCB2, ch), 0xff);
851 cpc_writeb(falcbase + F_REG(CCB3, ch), 0xff);
852 break;
853
854 case PC300_LC_B8ZS:
855 cpc_writeb(falcbase + F_REG(FMR0, ch),
856 cpc_readb(falcbase + F_REG(FMR0, ch)) |
857 FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1);
858 break;
859
860 case PC300_LC_NRZ:
861 cpc_writeb(falcbase + F_REG(FMR0, ch),
862 cpc_readb(falcbase + F_REG(FMR0, ch)) | 0x00);
863 break;
864 }
865
866 cpc_writeb(falcbase + F_REG(LIM0, ch),
867 cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_ELOS);
868 cpc_writeb(falcbase + F_REG(LIM0, ch),
869 cpc_readb(falcbase + F_REG(LIM0, ch)) & ~(LIM0_SCL1 | LIM0_SCL0));
870
871 cpc_writeb(falcbase + F_REG(FMR1, ch),
872 cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_IMOD);
873
874 switch (conf->fr_mode) {
875 case PC300_FR_ESF:
876 pfalc->multiframe_mode = 0;
877 cpc_writeb(falcbase + F_REG(FMR4, ch),
878 cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_FM1);
879 cpc_writeb(falcbase + F_REG(FMR1, ch),
880 cpc_readb(falcbase + F_REG(FMR1, ch)) |
881 FMR1_CRC | FMR1_EDL);
882 cpc_writeb(falcbase + F_REG(XDL1, ch), 0);
883 cpc_writeb(falcbase + F_REG(XDL2, ch), 0);
884 cpc_writeb(falcbase + F_REG(XDL3, ch), 0);
885 cpc_writeb(falcbase + F_REG(FMR0, ch),
886 cpc_readb(falcbase + F_REG(FMR0, ch)) & ~FMR0_SRAF);
887 cpc_writeb(falcbase + F_REG(FMR2, ch),
888 cpc_readb(falcbase + F_REG(FMR2,ch)) | FMR2_MCSP | FMR2_SSP);
889 break;
890
891 case PC300_FR_D4:
892 pfalc->multiframe_mode = 1;
893 cpc_writeb(falcbase + F_REG(FMR4, ch),
894 cpc_readb(falcbase + F_REG(FMR4, ch)) &
895 ~(FMR4_FM1 | FMR4_FM0));
896 cpc_writeb(falcbase + F_REG(FMR0, ch),
897 cpc_readb(falcbase + F_REG(FMR0, ch)) | FMR0_SRAF);
898 cpc_writeb(falcbase + F_REG(FMR2, ch),
899 cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_SSP);
900 break;
901 }
902
903
904 cpc_writeb(falcbase + F_REG(FMR4, ch),
905 cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_AUTO);
906
907
908 cpc_writeb(falcbase + F_REG(FMR2, ch),
909 cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA);
910
911
912 cpc_writeb(falcbase + F_REG(FMR1, ch),
913 cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_CTM);
914
915
916 cpc_writeb(falcbase + F_REG(FMR1, ch),
917 cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_SIGM);
918 cpc_writeb(falcbase + F_REG(FMR5, ch),
919 cpc_readb(falcbase + F_REG(FMR5, ch)) &
920 ~(FMR5_EIBR | FMR5_SRS));
921 cpc_writeb(falcbase + F_REG(CCR1, ch), 0);
922
923 cpc_writeb(falcbase + F_REG(LIM1, ch),
924 cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RIL0 | LIM1_RIL1);
925
926 switch (conf->lbo) {
927
928 case PC300_LBO_0_DB:
929 cpc_writeb(falcbase + F_REG(LIM2, ch), (LIM2_LOS1 | dja));
930 cpc_writeb(falcbase + F_REG(XPM0, ch), 0x5a);
931 cpc_writeb(falcbase + F_REG(XPM1, ch), 0x8f);
932 cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
933 break;
934 case PC300_LBO_7_5_DB:
935 cpc_writeb(falcbase + F_REG(LIM2, ch), (0x40 | LIM2_LOS1 | dja));
936 cpc_writeb(falcbase + F_REG(XPM0, ch), 0x11);
937 cpc_writeb(falcbase + F_REG(XPM1, ch), 0x02);
938 cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
939 break;
940 case PC300_LBO_15_DB:
941 cpc_writeb(falcbase + F_REG(LIM2, ch), (0x80 | LIM2_LOS1 | dja));
942 cpc_writeb(falcbase + F_REG(XPM0, ch), 0x8e);
943 cpc_writeb(falcbase + F_REG(XPM1, ch), 0x01);
944 cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
945 break;
946 case PC300_LBO_22_5_DB:
947 cpc_writeb(falcbase + F_REG(LIM2, ch), (0xc0 | LIM2_LOS1 | dja));
948 cpc_writeb(falcbase + F_REG(XPM0, ch), 0x09);
949 cpc_writeb(falcbase + F_REG(XPM1, ch), 0x01);
950 cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
951 break;
952 }
953
954
955 cpc_writeb(falcbase + F_REG(XC0, ch),
956 cpc_readb(falcbase + F_REG(XC0, ch)) | 0x01);
957
958 cpc_writeb(falcbase + F_REG(XC1, ch), 0x3e);
959
960 cpc_writeb(falcbase + F_REG(RC0, ch), 0x05);
961
962 cpc_writeb(falcbase + F_REG(RC1, ch), 0x00);
963
964
965 cpc_writeb(falcbase + F_REG(PCDR, ch), 0x0a);
966
967 cpc_writeb(falcbase + F_REG(PCRR, ch), 0x15);
968
969 cpc_writeb(falcbase + F_REG(IDLE, ch), 0x7f);
970
971 if (conf->fr_mode == PC300_FR_ESF_JAPAN) {
972 cpc_writeb(falcbase + F_REG(RC1, ch),
973 cpc_readb(falcbase + F_REG(RC1, ch)) | 0x80);
974 }
975
976 falc_close_all_timeslots(card, ch);
977}
978
979static void falc_init_e1(pc300_t * card, int ch)
980{
981 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
982 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
983 falc_t *pfalc = (falc_t *) & chan->falc;
984 void __iomem *falcbase = card->hw.falcbase;
985 ucchar dja = (ch ? (LIM2_DJA2 | LIM2_DJA1) : 0);
986
987
988 cpc_writeb(falcbase + F_REG(FMR1, ch),
989 cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_PMOD);
990
991
992 if (conf->phys_settings.clock_type == CLOCK_INT) {
993 cpc_writeb(falcbase + F_REG(LIM0, ch),
994 cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_MAS);
995 } else {
996 cpc_writeb(falcbase + F_REG(LIM0, ch),
997 cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_MAS);
998 }
999 cpc_writeb(falcbase + F_REG(LOOP, ch),
1000 cpc_readb(falcbase + F_REG(LOOP, ch)) & ~LOOP_SFM);
1001
1002 cpc_writeb(falcbase + F_REG(IPC, ch), IPC_SCI);
1003 cpc_writeb(falcbase + F_REG(FMR0, ch),
1004 cpc_readb(falcbase + F_REG(FMR0, ch)) &
1005 ~(FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1));
1006
1007 switch (conf->lcode) {
1008 case PC300_LC_AMI:
1009 cpc_writeb(falcbase + F_REG(FMR0, ch),
1010 cpc_readb(falcbase + F_REG(FMR0, ch)) |
1011 FMR0_XC1 | FMR0_RC1);
1012 break;
1013
1014 case PC300_LC_HDB3:
1015 cpc_writeb(falcbase + F_REG(FMR0, ch),
1016 cpc_readb(falcbase + F_REG(FMR0, ch)) |
1017 FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1);
1018 break;
1019
1020 case PC300_LC_NRZ:
1021 break;
1022 }
1023
1024 cpc_writeb(falcbase + F_REG(LIM0, ch),
1025 cpc_readb(falcbase + F_REG(LIM0, ch)) & ~(LIM0_SCL1 | LIM0_SCL0));
1026
1027 cpc_writeb(falcbase + F_REG(FMR1, ch),
1028 cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_IMOD);
1029
1030 cpc_writeb(falcbase + F_REG(XPM0, ch), 0x18);
1031 cpc_writeb(falcbase + F_REG(XPM1, ch), 0x03);
1032 cpc_writeb(falcbase + F_REG(XPM2, ch), 0x00);
1033
1034 switch (conf->fr_mode) {
1035 case PC300_FR_MF_CRC4:
1036 pfalc->multiframe_mode = 1;
1037 cpc_writeb(falcbase + F_REG(FMR1, ch),
1038 cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_XFS);
1039 cpc_writeb(falcbase + F_REG(FMR2, ch),
1040 cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_RFS1);
1041 cpc_writeb(falcbase + F_REG(FMR2, ch),
1042 cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_RFS0);
1043 cpc_writeb(falcbase + F_REG(FMR3, ch),
1044 cpc_readb(falcbase + F_REG(FMR3, ch)) & ~FMR3_EXTIW);
1045
1046
1047 cpc_writeb(falcbase + F_REG(FMR1, ch),
1048 cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_MFCS);
1049
1050
1051 cpc_writeb(falcbase + F_REG(FMR2, ch),
1052 cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_ALMF);
1053
1054
1055 cpc_writeb(falcbase + F_REG(XSP, ch),
1056 cpc_readb(falcbase + F_REG(XSP, ch)) & ~XSP_AXS);
1057 cpc_writeb(falcbase + F_REG(XSP, ch),
1058 cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_EBP);
1059 cpc_writeb(falcbase + F_REG(XSP, ch),
1060 cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_XS13 | XSP_XS15);
1061
1062
1063 cpc_writeb(falcbase + F_REG(FMR1, ch),
1064 cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_AFR);
1065
1066
1067 cpc_writeb(falcbase + F_REG(FMR2, ch),
1068 cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA);
1069
1070
1071 cpc_writeb(falcbase + F_REG(XSW, ch),
1072 cpc_readb(falcbase + F_REG(XSW, ch)) |
1073 XSW_XY0 | XSW_XY1 | XSW_XY2 | XSW_XY3 | XSW_XY4);
1074 break;
1075
1076 case PC300_FR_MF_NON_CRC4:
1077 case PC300_FR_D4:
1078 pfalc->multiframe_mode = 0;
1079 cpc_writeb(falcbase + F_REG(FMR1, ch),
1080 cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_XFS);
1081 cpc_writeb(falcbase + F_REG(FMR2, ch),
1082 cpc_readb(falcbase + F_REG(FMR2, ch)) &
1083 ~(FMR2_RFS1 | FMR2_RFS0));
1084 cpc_writeb(falcbase + F_REG(XSW, ch),
1085 cpc_readb(falcbase + F_REG(XSW, ch)) | XSW_XSIS);
1086 cpc_writeb(falcbase + F_REG(XSP, ch),
1087 cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_XSIF);
1088
1089
1090 cpc_writeb(falcbase + F_REG(FMR1, ch),
1091 cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_AFR);
1092
1093
1094 cpc_writeb(falcbase + F_REG(FMR2, ch),
1095 cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA);
1096
1097
1098 cpc_writeb(falcbase + F_REG(XSW, ch),
1099 cpc_readb(falcbase + F_REG(XSW, ch)) |
1100 XSW_XY0 | XSW_XY1 | XSW_XY2 | XSW_XY3 | XSW_XY4);
1101 break;
1102
1103 case PC300_FR_UNFRAMED:
1104 pfalc->multiframe_mode = 0;
1105 cpc_writeb(falcbase + F_REG(FMR1, ch),
1106 cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_XFS);
1107 cpc_writeb(falcbase + F_REG(FMR2, ch),
1108 cpc_readb(falcbase + F_REG(FMR2, ch)) &
1109 ~(FMR2_RFS1 | FMR2_RFS0));
1110 cpc_writeb(falcbase + F_REG(XSP, ch),
1111 cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_TT0);
1112 cpc_writeb(falcbase + F_REG(XSW, ch),
1113 cpc_readb(falcbase + F_REG(XSW, ch)) &
1114 ~(XSW_XTM|XSW_XY0|XSW_XY1|XSW_XY2|XSW_XY3|XSW_XY4));
1115 cpc_writeb(falcbase + F_REG(TSWM, ch), 0xff);
1116 cpc_writeb(falcbase + F_REG(FMR2, ch),
1117 cpc_readb(falcbase + F_REG(FMR2, ch)) |
1118 (FMR2_RTM | FMR2_DAIS));
1119 cpc_writeb(falcbase + F_REG(FMR2, ch),
1120 cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_AXRA);
1121 cpc_writeb(falcbase + F_REG(FMR1, ch),
1122 cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_AFR);
1123 pfalc->sync = 1;
1124 cpc_writeb(falcbase + card->hw.cpld_reg2,
1125 cpc_readb(falcbase + card->hw.cpld_reg2) |
1126 (CPLD_REG2_FALC_LED2 << (2 * ch)));
1127 break;
1128 }
1129
1130
1131 cpc_writeb(falcbase + F_REG(XSP, ch),
1132 cpc_readb(falcbase + F_REG(XSP, ch)) & ~XSP_CASEN);
1133 cpc_writeb(falcbase + F_REG(CCR1, ch), 0);
1134
1135 cpc_writeb(falcbase + F_REG(LIM1, ch),
1136 cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RIL0 | LIM1_RIL1);
1137 cpc_writeb(falcbase + F_REG(LIM2, ch), (LIM2_LOS1 | dja));
1138
1139
1140 cpc_writeb(falcbase + F_REG(XC0, ch),
1141 cpc_readb(falcbase + F_REG(XC0, ch)) | 0x01);
1142
1143 cpc_writeb(falcbase + F_REG(XC1, ch), 0x3e);
1144
1145 cpc_writeb(falcbase + F_REG(RC0, ch), 0x05);
1146
1147 cpc_writeb(falcbase + F_REG(RC1, ch), 0x00);
1148
1149
1150 cpc_writeb(falcbase + F_REG(PCDR, ch), 0x0a);
1151
1152 cpc_writeb(falcbase + F_REG(PCRR, ch), 0x15);
1153
1154 cpc_writeb(falcbase + F_REG(IDLE, ch), 0x7f);
1155
1156 falc_close_all_timeslots(card, ch);
1157}
1158
1159static void falc_init_hdlc(pc300_t * card, int ch)
1160{
1161 void __iomem *falcbase = card->hw.falcbase;
1162 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1163 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1164
1165
1166 if (conf->fr_mode == PC300_FR_UNFRAMED) {
1167 cpc_writeb(falcbase + F_REG(MODE, ch), 0);
1168 } else {
1169 cpc_writeb(falcbase + F_REG(MODE, ch),
1170 cpc_readb(falcbase + F_REG(MODE, ch)) |
1171 (MODE_HRAC | MODE_MDS2));
1172 cpc_writeb(falcbase + F_REG(RAH2, ch), 0xff);
1173 cpc_writeb(falcbase + F_REG(RAH1, ch), 0xff);
1174 cpc_writeb(falcbase + F_REG(RAL2, ch), 0xff);
1175 cpc_writeb(falcbase + F_REG(RAL1, ch), 0xff);
1176 }
1177
1178
1179 falc_issue_cmd(card, ch, CMDR_RRES | CMDR_XRES | CMDR_SRES);
1180
1181
1182 falc_intr_enable(card, ch);
1183}
1184
1185static void te_config(pc300_t * card, int ch)
1186{
1187 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1188 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1189 falc_t *pfalc = (falc_t *) & chan->falc;
1190 void __iomem *falcbase = card->hw.falcbase;
1191 ucchar dummy;
1192 unsigned long flags;
1193
1194 memset(pfalc, 0, sizeof(falc_t));
1195 switch (conf->media) {
1196 case IF_IFACE_T1:
1197 pfalc->num_channels = NUM_OF_T1_CHANNELS;
1198 pfalc->offset = 1;
1199 break;
1200 case IF_IFACE_E1:
1201 pfalc->num_channels = NUM_OF_E1_CHANNELS;
1202 pfalc->offset = 0;
1203 break;
1204 }
1205 if (conf->tslot_bitmap == 0xffffffffUL)
1206 pfalc->full_bandwidth = 1;
1207 else
1208 pfalc->full_bandwidth = 0;
1209
1210 CPC_LOCK(card, flags);
1211
1212 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
1213 cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) |
1214 (CPLD_REG1_FALC_RESET << (2 * ch)));
1215 udelay(10000);
1216 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
1217 cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) &
1218 ~(CPLD_REG1_FALC_RESET << (2 * ch)));
1219
1220 if (conf->media == IF_IFACE_T1) {
1221 falc_init_t1(card, ch);
1222 } else {
1223 falc_init_e1(card, ch);
1224 }
1225 falc_init_hdlc(card, ch);
1226 if (conf->rx_sens == PC300_RX_SENS_SH) {
1227 cpc_writeb(falcbase + F_REG(LIM0, ch),
1228 cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_EQON);
1229 } else {
1230 cpc_writeb(falcbase + F_REG(LIM0, ch),
1231 cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_EQON);
1232 }
1233 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
1234 cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) |
1235 ((CPLD_REG2_FALC_TX_CLK | CPLD_REG2_FALC_RX_CLK) << (2 * ch)));
1236
1237
1238 dummy = cpc_readb(falcbase + F_REG(FISR0, ch)) +
1239 cpc_readb(falcbase + F_REG(FISR1, ch)) +
1240 cpc_readb(falcbase + F_REG(FISR2, ch)) +
1241 cpc_readb(falcbase + F_REG(FISR3, ch));
1242 CPC_UNLOCK(card, flags);
1243}
1244
1245static void falc_check_status(pc300_t * card, int ch, unsigned char frs0)
1246{
1247 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1248 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1249 falc_t *pfalc = (falc_t *) & chan->falc;
1250 void __iomem *falcbase = card->hw.falcbase;
1251
1252
1253 if (frs0 & FRS0_LOS) {
1254 if (!pfalc->red_alarm) {
1255 pfalc->red_alarm = 1;
1256 pfalc->los++;
1257 if (!pfalc->blue_alarm) {
1258
1259 if (conf->media == IF_IFACE_T1) {
1260
1261
1262 cpc_writeb(falcbase + F_REG(IMR0, ch),
1263 cpc_readb(falcbase + F_REG(IMR0, ch))
1264 | IMR0_PDEN);
1265 }
1266 falc_disable_comm(card, ch);
1267
1268 }
1269 }
1270 } else {
1271 if (pfalc->red_alarm) {
1272 pfalc->red_alarm = 0;
1273 pfalc->losr++;
1274 }
1275 }
1276
1277 if (conf->fr_mode != PC300_FR_UNFRAMED) {
1278
1279 if (frs0 & FRS0_AIS) {
1280 if (!pfalc->blue_alarm) {
1281 pfalc->blue_alarm = 1;
1282 pfalc->ais++;
1283
1284 if (conf->media == IF_IFACE_T1) {
1285
1286 cpc_writeb(falcbase + F_REG(IMR0, ch),
1287 cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
1288 }
1289 falc_disable_comm(card, ch);
1290
1291 }
1292 } else {
1293 pfalc->blue_alarm = 0;
1294 }
1295
1296
1297 if (frs0 & FRS0_LFA) {
1298 if (!pfalc->loss_fa) {
1299 pfalc->loss_fa = 1;
1300 pfalc->lfa++;
1301 if (!pfalc->blue_alarm && !pfalc->red_alarm) {
1302
1303 if (conf->media == IF_IFACE_T1) {
1304
1305
1306 cpc_writeb(falcbase + F_REG(IMR0, ch),
1307 cpc_readb(falcbase + F_REG(IMR0, ch))
1308 | IMR0_PDEN);
1309 }
1310 falc_disable_comm(card, ch);
1311
1312 }
1313 }
1314 } else {
1315 if (pfalc->loss_fa) {
1316 pfalc->loss_fa = 0;
1317 pfalc->farec++;
1318 }
1319 }
1320
1321
1322 if (pfalc->multiframe_mode && (frs0 & FRS0_LMFA)) {
1323
1324 if (!pfalc->loss_mfa) {
1325 pfalc->loss_mfa = 1;
1326 pfalc->lmfa++;
1327 if (!pfalc->blue_alarm && !pfalc->red_alarm &&
1328 !pfalc->loss_fa) {
1329
1330 if (conf->media == IF_IFACE_T1) {
1331
1332
1333 cpc_writeb(falcbase + F_REG(IMR0, ch),
1334 cpc_readb(falcbase + F_REG(IMR0, ch))
1335 | IMR0_PDEN);
1336 }
1337 falc_disable_comm(card, ch);
1338
1339 }
1340 }
1341 } else {
1342 pfalc->loss_mfa = 0;
1343 }
1344
1345
1346 if (frs0 & FRS0_RRA) {
1347 if (!pfalc->yellow_alarm) {
1348 pfalc->yellow_alarm = 1;
1349 pfalc->rai++;
1350 if (pfalc->sync) {
1351
1352 falc_disable_comm(card, ch);
1353
1354 }
1355 }
1356 } else {
1357 pfalc->yellow_alarm = 0;
1358 }
1359 }
1360
1361 if (pfalc->red_alarm || pfalc->loss_fa ||
1362 pfalc->loss_mfa || pfalc->blue_alarm) {
1363 if (pfalc->sync) {
1364 pfalc->sync = 0;
1365 chan->d.line_off++;
1366 cpc_writeb(falcbase + card->hw.cpld_reg2,
1367 cpc_readb(falcbase + card->hw.cpld_reg2) &
1368 ~(CPLD_REG2_FALC_LED2 << (2 * ch)));
1369 }
1370 } else {
1371 if (!pfalc->sync) {
1372 pfalc->sync = 1;
1373 chan->d.line_on++;
1374 cpc_writeb(falcbase + card->hw.cpld_reg2,
1375 cpc_readb(falcbase + card->hw.cpld_reg2) |
1376 (CPLD_REG2_FALC_LED2 << (2 * ch)));
1377 }
1378 }
1379
1380 if (pfalc->sync && !pfalc->yellow_alarm) {
1381 if (!pfalc->active) {
1382
1383 if (pfalc->loop_active) {
1384 return;
1385 }
1386 if (conf->media == IF_IFACE_T1) {
1387 cpc_writeb(falcbase + F_REG(IMR0, ch),
1388 cpc_readb(falcbase + F_REG(IMR0, ch)) & ~IMR0_PDEN);
1389 }
1390 falc_enable_comm(card, ch);
1391
1392 pfalc->active = 1;
1393 }
1394 } else {
1395 if (pfalc->active) {
1396 pfalc->active = 0;
1397 }
1398 }
1399}
1400
1401static void falc_update_stats(pc300_t * card, int ch)
1402{
1403 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1404 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1405 falc_t *pfalc = (falc_t *) & chan->falc;
1406 void __iomem *falcbase = card->hw.falcbase;
1407 ucshort counter;
1408
1409 counter = cpc_readb(falcbase + F_REG(FECL, ch));
1410 counter |= cpc_readb(falcbase + F_REG(FECH, ch)) << 8;
1411 pfalc->fec += counter;
1412
1413 counter = cpc_readb(falcbase + F_REG(CVCL, ch));
1414 counter |= cpc_readb(falcbase + F_REG(CVCH, ch)) << 8;
1415 pfalc->cvc += counter;
1416
1417 counter = cpc_readb(falcbase + F_REG(CECL, ch));
1418 counter |= cpc_readb(falcbase + F_REG(CECH, ch)) << 8;
1419 pfalc->cec += counter;
1420
1421 counter = cpc_readb(falcbase + F_REG(EBCL, ch));
1422 counter |= cpc_readb(falcbase + F_REG(EBCH, ch)) << 8;
1423 pfalc->ebc += counter;
1424
1425 if (cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) {
1426 mdelay(10);
1427 counter = cpc_readb(falcbase + F_REG(BECL, ch));
1428 counter |= cpc_readb(falcbase + F_REG(BECH, ch)) << 8;
1429 pfalc->bec += counter;
1430
1431 if (((conf->media == IF_IFACE_T1) &&
1432 (cpc_readb(falcbase + F_REG(FRS1, ch)) & FRS1_LLBAD) &&
1433 (!(cpc_readb(falcbase + F_REG(FRS1, ch)) & FRS1_PDEN)))
1434 ||
1435 ((conf->media == IF_IFACE_E1) &&
1436 (cpc_readb(falcbase + F_REG(RSP, ch)) & RSP_LLBAD))) {
1437 pfalc->prbs = 2;
1438 } else {
1439 pfalc->prbs = 1;
1440 }
1441 }
1442}
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454static void falc_remote_loop(pc300_t * card, int ch, int loop_on)
1455{
1456 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1457 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1458 falc_t *pfalc = (falc_t *) & chan->falc;
1459 void __iomem *falcbase = card->hw.falcbase;
1460
1461 if (loop_on) {
1462
1463 if (conf->media == IF_IFACE_T1) {
1464
1465
1466 cpc_writeb(falcbase + F_REG(IMR0, ch),
1467 cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
1468 }
1469 falc_disable_comm(card, ch);
1470
1471 cpc_writeb(falcbase + F_REG(LIM1, ch),
1472 cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RL);
1473 pfalc->loop_active = 1;
1474 } else {
1475 cpc_writeb(falcbase + F_REG(LIM1, ch),
1476 cpc_readb(falcbase + F_REG(LIM1, ch)) & ~LIM1_RL);
1477 pfalc->sync = 0;
1478 cpc_writeb(falcbase + card->hw.cpld_reg2,
1479 cpc_readb(falcbase + card->hw.cpld_reg2) &
1480 ~(CPLD_REG2_FALC_LED2 << (2 * ch)));
1481 pfalc->active = 0;
1482 falc_issue_cmd(card, ch, CMDR_XRES);
1483 pfalc->loop_active = 0;
1484 }
1485}
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499static void falc_local_loop(pc300_t * card, int ch, int loop_on)
1500{
1501 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1502 falc_t *pfalc = (falc_t *) & chan->falc;
1503 void __iomem *falcbase = card->hw.falcbase;
1504
1505 if (loop_on) {
1506 cpc_writeb(falcbase + F_REG(LIM0, ch),
1507 cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_LL);
1508 pfalc->loop_active = 1;
1509 } else {
1510 cpc_writeb(falcbase + F_REG(LIM0, ch),
1511 cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_LL);
1512 pfalc->loop_active = 0;
1513 }
1514}
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526static void falc_payload_loop(pc300_t * card, int ch, int loop_on)
1527{
1528 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1529 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1530 falc_t *pfalc = (falc_t *) & chan->falc;
1531 void __iomem *falcbase = card->hw.falcbase;
1532
1533 if (loop_on) {
1534
1535 if (conf->media == IF_IFACE_T1) {
1536
1537
1538 cpc_writeb(falcbase + F_REG(IMR0, ch),
1539 cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
1540 }
1541 falc_disable_comm(card, ch);
1542
1543 cpc_writeb(falcbase + F_REG(FMR2, ch),
1544 cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_PLB);
1545 if (conf->media == IF_IFACE_T1) {
1546 cpc_writeb(falcbase + F_REG(FMR4, ch),
1547 cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_TM);
1548 } else {
1549 cpc_writeb(falcbase + F_REG(FMR5, ch),
1550 cpc_readb(falcbase + F_REG(FMR5, ch)) | XSP_TT0);
1551 }
1552 falc_open_all_timeslots(card, ch);
1553 pfalc->loop_active = 2;
1554 } else {
1555 cpc_writeb(falcbase + F_REG(FMR2, ch),
1556 cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_PLB);
1557 if (conf->media == IF_IFACE_T1) {
1558 cpc_writeb(falcbase + F_REG(FMR4, ch),
1559 cpc_readb(falcbase + F_REG(FMR4, ch)) & ~FMR4_TM);
1560 } else {
1561 cpc_writeb(falcbase + F_REG(FMR5, ch),
1562 cpc_readb(falcbase + F_REG(FMR5, ch)) & ~XSP_TT0);
1563 }
1564 pfalc->sync = 0;
1565 cpc_writeb(falcbase + card->hw.cpld_reg2,
1566 cpc_readb(falcbase + card->hw.cpld_reg2) &
1567 ~(CPLD_REG2_FALC_LED2 << (2 * ch)));
1568 pfalc->active = 0;
1569 falc_issue_cmd(card, ch, CMDR_XRES);
1570 pfalc->loop_active = 0;
1571 }
1572}
1573
1574
1575
1576
1577
1578
1579
1580static void turn_off_xlu(pc300_t * card, int ch)
1581{
1582 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1583 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1584 void __iomem *falcbase = card->hw.falcbase;
1585
1586 if (conf->media == IF_IFACE_T1) {
1587 cpc_writeb(falcbase + F_REG(FMR5, ch),
1588 cpc_readb(falcbase + F_REG(FMR5, ch)) & ~FMR5_XLU);
1589 } else {
1590 cpc_writeb(falcbase + F_REG(FMR3, ch),
1591 cpc_readb(falcbase + F_REG(FMR3, ch)) & ~FMR3_XLU);
1592 }
1593}
1594
1595
1596
1597
1598
1599
1600
1601static void turn_off_xld(pc300_t * card, int ch)
1602{
1603 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1604 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1605 void __iomem *falcbase = card->hw.falcbase;
1606
1607 if (conf->media == IF_IFACE_T1) {
1608 cpc_writeb(falcbase + F_REG(FMR5, ch),
1609 cpc_readb(falcbase + F_REG(FMR5, ch)) & ~FMR5_XLD);
1610 } else {
1611 cpc_writeb(falcbase + F_REG(FMR3, ch),
1612 cpc_readb(falcbase + F_REG(FMR3, ch)) & ~FMR3_XLD);
1613 }
1614}
1615
1616
1617
1618
1619
1620
1621
1622
1623static void falc_generate_loop_up_code(pc300_t * card, int ch)
1624{
1625 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1626 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1627 falc_t *pfalc = (falc_t *) & chan->falc;
1628 void __iomem *falcbase = card->hw.falcbase;
1629
1630 if (conf->media == IF_IFACE_T1) {
1631 cpc_writeb(falcbase + F_REG(FMR5, ch),
1632 cpc_readb(falcbase + F_REG(FMR5, ch)) | FMR5_XLU);
1633 } else {
1634 cpc_writeb(falcbase + F_REG(FMR3, ch),
1635 cpc_readb(falcbase + F_REG(FMR3, ch)) | FMR3_XLU);
1636 }
1637
1638 if (conf->media == IF_IFACE_T1) {
1639
1640
1641 cpc_writeb(falcbase + F_REG(IMR0, ch),
1642 cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
1643 }
1644 falc_disable_comm(card, ch);
1645
1646 pfalc->loop_gen = 1;
1647}
1648
1649
1650
1651
1652
1653
1654
1655
1656static void falc_generate_loop_down_code(pc300_t * card, int ch)
1657{
1658 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1659 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1660 falc_t *pfalc = (falc_t *) & chan->falc;
1661 void __iomem *falcbase = card->hw.falcbase;
1662
1663 if (conf->media == IF_IFACE_T1) {
1664 cpc_writeb(falcbase + F_REG(FMR5, ch),
1665 cpc_readb(falcbase + F_REG(FMR5, ch)) | FMR5_XLD);
1666 } else {
1667 cpc_writeb(falcbase + F_REG(FMR3, ch),
1668 cpc_readb(falcbase + F_REG(FMR3, ch)) | FMR3_XLD);
1669 }
1670 pfalc->sync = 0;
1671 cpc_writeb(falcbase + card->hw.cpld_reg2,
1672 cpc_readb(falcbase + card->hw.cpld_reg2) &
1673 ~(CPLD_REG2_FALC_LED2 << (2 * ch)));
1674 pfalc->active = 0;
1675
1676 pfalc->loop_gen = 0;
1677}
1678
1679
1680
1681
1682
1683
1684
1685
1686static void falc_pattern_test(pc300_t * card, int ch, unsigned int activate)
1687{
1688 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1689 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1690 falc_t *pfalc = (falc_t *) & chan->falc;
1691 void __iomem *falcbase = card->hw.falcbase;
1692
1693 if (activate) {
1694 pfalc->prbs = 1;
1695 pfalc->bec = 0;
1696 if (conf->media == IF_IFACE_T1) {
1697
1698 cpc_writeb(falcbase + F_REG(IMR3, ch),
1699 cpc_readb(falcbase + F_REG(IMR3, ch)) | IMR3_LLBSC);
1700 } else {
1701
1702 cpc_writeb(falcbase + F_REG(IMR1, ch),
1703 cpc_readb(falcbase + F_REG(IMR1, ch)) | IMR1_LLBSC);
1704 }
1705
1706
1707 cpc_writeb(falcbase + F_REG(LCR1, ch),
1708 cpc_readb(falcbase + F_REG(LCR1, ch)) | LCR1_EPRM | LCR1_XPRBS);
1709 } else {
1710 pfalc->prbs = 0;
1711
1712
1713 cpc_writeb(falcbase + F_REG(LCR1, ch),
1714 cpc_readb(falcbase+F_REG(LCR1,ch)) & ~(LCR1_EPRM | LCR1_XPRBS));
1715 if (conf->media == IF_IFACE_T1) {
1716
1717 cpc_writeb(falcbase + F_REG(IMR3, ch),
1718 cpc_readb(falcbase + F_REG(IMR3, ch)) & ~IMR3_LLBSC);
1719 } else {
1720
1721 cpc_writeb(falcbase + F_REG(IMR1, ch),
1722 cpc_readb(falcbase + F_REG(IMR1, ch)) & ~IMR1_LLBSC);
1723 }
1724 }
1725}
1726
1727
1728
1729
1730
1731
1732
1733static ucshort falc_pattern_test_error(pc300_t * card, int ch)
1734{
1735 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1736 falc_t *pfalc = (falc_t *) & chan->falc;
1737
1738 return (pfalc->bec);
1739}
1740
1741
1742
1743
1744
1745static void
1746cpc_trace(struct net_device *dev, struct sk_buff *skb_main, char rx_tx)
1747{
1748 struct sk_buff *skb;
1749
1750 if ((skb = dev_alloc_skb(10 + skb_main->len)) == NULL) {
1751 printk("%s: out of memory\n", dev->name);
1752 return;
1753 }
1754 skb_put(skb, 10 + skb_main->len);
1755
1756 skb->dev = dev;
1757 skb->protocol = htons(ETH_P_CUST);
1758 skb_reset_mac_header(skb);
1759 skb->pkt_type = PACKET_HOST;
1760 skb->len = 10 + skb_main->len;
1761
1762 skb_copy_to_linear_data(skb, dev->name, 5);
1763 skb->data[5] = '[';
1764 skb->data[6] = rx_tx;
1765 skb->data[7] = ']';
1766 skb->data[8] = ':';
1767 skb->data[9] = ' ';
1768 skb_copy_from_linear_data(skb_main, &skb->data[10], skb_main->len);
1769
1770 netif_rx(skb);
1771}
1772
1773static void cpc_tx_timeout(struct net_device *dev)
1774{
1775 pc300dev_t *d = (pc300dev_t *) dev->priv;
1776 pc300ch_t *chan = (pc300ch_t *) d->chan;
1777 pc300_t *card = (pc300_t *) chan->card;
1778 struct net_device_stats *stats = hdlc_stats(dev);
1779 int ch = chan->channel;
1780 unsigned long flags;
1781 ucchar ilar;
1782
1783 stats->tx_errors++;
1784 stats->tx_aborted_errors++;
1785 CPC_LOCK(card, flags);
1786 if ((ilar = cpc_readb(card->hw.scabase + ILAR)) != 0) {
1787 printk("%s: ILAR=0x%x\n", dev->name, ilar);
1788 cpc_writeb(card->hw.scabase + ILAR, ilar);
1789 cpc_writeb(card->hw.scabase + DMER, 0x80);
1790 }
1791 if (card->hw.type == PC300_TE) {
1792 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
1793 cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) &
1794 ~(CPLD_REG2_FALC_LED1 << (2 * ch)));
1795 }
1796 dev->trans_start = jiffies;
1797 CPC_UNLOCK(card, flags);
1798 netif_wake_queue(dev);
1799}
1800
1801static int cpc_queue_xmit(struct sk_buff *skb, struct net_device *dev)
1802{
1803 pc300dev_t *d = (pc300dev_t *) dev->priv;
1804 pc300ch_t *chan = (pc300ch_t *) d->chan;
1805 pc300_t *card = (pc300_t *) chan->card;
1806 struct net_device_stats *stats = hdlc_stats(dev);
1807 int ch = chan->channel;
1808 unsigned long flags;
1809#ifdef PC300_DEBUG_TX
1810 int i;
1811#endif
1812
1813 if (chan->conf.monitor) {
1814
1815 dev_kfree_skb(skb);
1816 return 0;
1817 } else if (!netif_carrier_ok(dev)) {
1818
1819 dev_kfree_skb(skb);
1820 stats->tx_errors++;
1821 stats->tx_carrier_errors++;
1822 return 0;
1823 } else if (cpc_readb(card->hw.scabase + M_REG(ST3, ch)) & ST3_DCD) {
1824 printk("%s: DCD is OFF. Going administrative down.\n", dev->name);
1825 stats->tx_errors++;
1826 stats->tx_carrier_errors++;
1827 dev_kfree_skb(skb);
1828 netif_carrier_off(dev);
1829 CPC_LOCK(card, flags);
1830 cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_TX_BUF_CLR);
1831 if (card->hw.type == PC300_TE) {
1832 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
1833 cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) &
1834 ~(CPLD_REG2_FALC_LED1 << (2 * ch)));
1835 }
1836 CPC_UNLOCK(card, flags);
1837 netif_wake_queue(dev);
1838 return 0;
1839 }
1840
1841
1842 if (dma_buf_write(card, ch, (ucchar *) skb->data, skb->len) != 0) {
1843
1844 netif_stop_queue(dev);
1845 dev_kfree_skb(skb);
1846 stats->tx_errors++;
1847 stats->tx_dropped++;
1848 return 0;
1849 }
1850#ifdef PC300_DEBUG_TX
1851 printk("%s T:", dev->name);
1852 for (i = 0; i < skb->len; i++)
1853 printk(" %02x", *(skb->data + i));
1854 printk("\n");
1855#endif
1856
1857 if (d->trace_on) {
1858 cpc_trace(dev, skb, 'T');
1859 }
1860 dev->trans_start = jiffies;
1861
1862
1863 CPC_LOCK(card, flags);
1864
1865 if (card->chan[ch].nfree_tx_bd <= 1) {
1866
1867 netif_stop_queue(dev);
1868 }
1869 cpc_writel(card->hw.scabase + DTX_REG(EDAL, ch),
1870 TX_BD_ADDR(ch, chan->tx_next_bd));
1871 cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_TX_ENA);
1872 cpc_writeb(card->hw.scabase + DSR_TX(ch), DSR_DE);
1873 if (card->hw.type == PC300_TE) {
1874 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
1875 cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) |
1876 (CPLD_REG2_FALC_LED1 << (2 * ch)));
1877 }
1878 CPC_UNLOCK(card, flags);
1879 dev_kfree_skb(skb);
1880
1881 return 0;
1882}
1883
1884static void cpc_net_rx(struct net_device *dev)
1885{
1886 pc300dev_t *d = (pc300dev_t *) dev->priv;
1887 pc300ch_t *chan = (pc300ch_t *) d->chan;
1888 pc300_t *card = (pc300_t *) chan->card;
1889 struct net_device_stats *stats = hdlc_stats(dev);
1890 int ch = chan->channel;
1891#ifdef PC300_DEBUG_RX
1892 int i;
1893#endif
1894 int rxb;
1895 struct sk_buff *skb;
1896
1897 while (1) {
1898 if ((rxb = dma_get_rx_frame_size(card, ch)) == -1)
1899 return;
1900
1901 if (!netif_carrier_ok(dev)) {
1902
1903 printk("%s : DCD is OFF - drop %d rx bytes\n", dev->name, rxb);
1904 skb = NULL;
1905 } else {
1906 if (rxb > (dev->mtu + 40)) {
1907 printk("%s : MTU exceeded %d\n", dev->name, rxb);
1908 skb = NULL;
1909 } else {
1910 skb = dev_alloc_skb(rxb);
1911 if (skb == NULL) {
1912 printk("%s: Memory squeeze!!\n", dev->name);
1913 return;
1914 }
1915 skb->dev = dev;
1916 }
1917 }
1918
1919 if (((rxb = dma_buf_read(card, ch, skb)) <= 0) || (skb == NULL)) {
1920#ifdef PC300_DEBUG_RX
1921 printk("%s: rxb = %x\n", dev->name, rxb);
1922#endif
1923 if ((skb == NULL) && (rxb > 0)) {
1924
1925 stats->rx_errors++;
1926 stats->rx_length_errors++;
1927 continue;
1928 }
1929
1930 if (rxb < 0) {
1931 rxb = -rxb;
1932 if (rxb & DST_OVR) {
1933 stats->rx_errors++;
1934 stats->rx_fifo_errors++;
1935 }
1936 if (rxb & DST_CRC) {
1937 stats->rx_errors++;
1938 stats->rx_crc_errors++;
1939 }
1940 if (rxb & (DST_RBIT | DST_SHRT | DST_ABT)) {
1941 stats->rx_errors++;
1942 stats->rx_frame_errors++;
1943 }
1944 }
1945 if (skb) {
1946 dev_kfree_skb_irq(skb);
1947 }
1948 continue;
1949 }
1950
1951 stats->rx_bytes += rxb;
1952
1953#ifdef PC300_DEBUG_RX
1954 printk("%s R:", dev->name);
1955 for (i = 0; i < skb->len; i++)
1956 printk(" %02x", *(skb->data + i));
1957 printk("\n");
1958#endif
1959 if (d->trace_on) {
1960 cpc_trace(dev, skb, 'R');
1961 }
1962 stats->rx_packets++;
1963 skb->protocol = hdlc_type_trans(skb, dev);
1964 netif_rx(skb);
1965 }
1966}
1967
1968
1969
1970
1971static void sca_tx_intr(pc300dev_t *dev)
1972{
1973 pc300ch_t *chan = (pc300ch_t *)dev->chan;
1974 pc300_t *card = (pc300_t *)chan->card;
1975 int ch = chan->channel;
1976 volatile pcsca_bd_t __iomem * ptdescr;
1977 struct net_device_stats *stats = hdlc_stats(dev->dev);
1978
1979
1980 ptdescr = (card->hw.rambase +
1981 TX_BD_ADDR(ch,chan->tx_first_bd));
1982 while ((cpc_readl(card->hw.scabase + DTX_REG(CDAL,ch)) !=
1983 TX_BD_ADDR(ch,chan->tx_first_bd)) &&
1984 (cpc_readb(&ptdescr->status) & DST_OSB)) {
1985 stats->tx_packets++;
1986 stats->tx_bytes += cpc_readw(&ptdescr->len);
1987 cpc_writeb(&ptdescr->status, DST_OSB);
1988 cpc_writew(&ptdescr->len, 0);
1989 chan->nfree_tx_bd++;
1990 chan->tx_first_bd = (chan->tx_first_bd + 1) & (N_DMA_TX_BUF - 1);
1991 ptdescr = (card->hw.rambase + TX_BD_ADDR(ch,chan->tx_first_bd));
1992 }
1993
1994#ifdef CONFIG_PC300_MLPPP
1995 if (chan->conf.proto == PC300_PROTO_MLPPP) {
1996 cpc_tty_trigger_poll(dev);
1997 } else {
1998#endif
1999
2000 netif_wake_queue(dev->dev);
2001#ifdef CONFIG_PC300_MLPPP
2002 }
2003#endif
2004}
2005
2006static void sca_intr(pc300_t * card)
2007{
2008 void __iomem *scabase = card->hw.scabase;
2009 volatile uclong status;
2010 int ch;
2011 int intr_count = 0;
2012 unsigned char dsr_rx;
2013
2014 while ((status = cpc_readl(scabase + ISR0)) != 0) {
2015 for (ch = 0; ch < card->hw.nchan; ch++) {
2016 pc300ch_t *chan = &card->chan[ch];
2017 pc300dev_t *d = &chan->d;
2018 struct net_device *dev = d->dev;
2019
2020 spin_lock(&card->card_lock);
2021
2022
2023 if (status & IR0_DRX((IR0_DMIA | IR0_DMIB), ch)) {
2024 ucchar drx_stat = cpc_readb(scabase + DSR_RX(ch));
2025
2026
2027 cpc_writeb(scabase + DSR_RX(ch), drx_stat | DSR_DWE);
2028
2029#ifdef PC300_DEBUG_INTR
2030 printk ("sca_intr: RX intr chan[%d] (st=0x%08lx, dsr=0x%02x)\n",
2031 ch, status, drx_stat);
2032#endif
2033 if (status & IR0_DRX(IR0_DMIA, ch)) {
2034 if (drx_stat & DSR_BOF) {
2035#ifdef CONFIG_PC300_MLPPP
2036 if (chan->conf.proto == PC300_PROTO_MLPPP) {
2037
2038 if ((cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) {
2039 rx_dma_stop(card, ch);
2040 }
2041 cpc_tty_receive(d);
2042 rx_dma_start(card, ch);
2043 } else
2044#endif
2045 {
2046 if ((cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) {
2047 rx_dma_stop(card, ch);
2048 }
2049 cpc_net_rx(dev);
2050
2051 hdlc_stats(dev)->rx_errors++;
2052 hdlc_stats(dev)->rx_over_errors++;
2053 chan->rx_first_bd = 0;
2054 chan->rx_last_bd = N_DMA_RX_BUF - 1;
2055 rx_dma_start(card, ch);
2056 }
2057 }
2058 }
2059 if (status & IR0_DRX(IR0_DMIB, ch)) {
2060 if (drx_stat & DSR_EOM) {
2061 if (card->hw.type == PC300_TE) {
2062 cpc_writeb(card->hw.falcbase +
2063 card->hw.cpld_reg2,
2064 cpc_readb (card->hw.falcbase +
2065 card->hw.cpld_reg2) |
2066 (CPLD_REG2_FALC_LED1 << (2 * ch)));
2067 }
2068#ifdef CONFIG_PC300_MLPPP
2069 if (chan->conf.proto == PC300_PROTO_MLPPP) {
2070
2071 cpc_tty_receive(d);
2072 } else {
2073 cpc_net_rx(dev);
2074 }
2075#else
2076 cpc_net_rx(dev);
2077#endif
2078 if (card->hw.type == PC300_TE) {
2079 cpc_writeb(card->hw.falcbase +
2080 card->hw.cpld_reg2,
2081 cpc_readb (card->hw.falcbase +
2082 card->hw.cpld_reg2) &
2083 ~ (CPLD_REG2_FALC_LED1 << (2 * ch)));
2084 }
2085 }
2086 }
2087 if (!(dsr_rx = cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) {
2088#ifdef PC300_DEBUG_INTR
2089 printk("%s: RX intr chan[%d] (st=0x%08lx, dsr=0x%02x, dsr2=0x%02x)\n",
2090 dev->name, ch, status, drx_stat, dsr_rx);
2091#endif
2092 cpc_writeb(scabase + DSR_RX(ch), (dsr_rx | DSR_DE) & 0xfe);
2093 }
2094 }
2095
2096
2097 if (status & IR0_DTX((IR0_EFT | IR0_DMIA | IR0_DMIB), ch)) {
2098 ucchar dtx_stat = cpc_readb(scabase + DSR_TX(ch));
2099
2100
2101 cpc_writeb(scabase + DSR_TX(ch), dtx_stat | DSR_DWE);
2102
2103#ifdef PC300_DEBUG_INTR
2104 printk ("sca_intr: TX intr chan[%d] (st=0x%08lx, dsr=0x%02x)\n",
2105 ch, status, dtx_stat);
2106#endif
2107 if (status & IR0_DTX(IR0_EFT, ch)) {
2108 if (dtx_stat & DSR_UDRF) {
2109 if (cpc_readb (scabase + M_REG(TBN, ch)) != 0) {
2110 cpc_writeb(scabase + M_REG(CMD,ch), CMD_TX_BUF_CLR);
2111 }
2112 if (card->hw.type == PC300_TE) {
2113 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
2114 cpc_readb (card->hw.falcbase +
2115 card->hw.cpld_reg2) &
2116 ~ (CPLD_REG2_FALC_LED1 << (2 * ch)));
2117 }
2118 hdlc_stats(dev)->tx_errors++;
2119 hdlc_stats(dev)->tx_fifo_errors++;
2120 sca_tx_intr(d);
2121 }
2122 }
2123 if (status & IR0_DTX(IR0_DMIA, ch)) {
2124 if (dtx_stat & DSR_BOF) {
2125 }
2126 }
2127 if (status & IR0_DTX(IR0_DMIB, ch)) {
2128 if (dtx_stat & DSR_EOM) {
2129 if (card->hw.type == PC300_TE) {
2130 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
2131 cpc_readb (card->hw.falcbase +
2132 card->hw.cpld_reg2) &
2133 ~ (CPLD_REG2_FALC_LED1 << (2 * ch)));
2134 }
2135 sca_tx_intr(d);
2136 }
2137 }
2138 }
2139
2140
2141 if (status & IR0_M(IR0_RXINTA, ch)) {
2142 ucchar st1 = cpc_readb(scabase + M_REG(ST1, ch));
2143
2144
2145 cpc_writeb(scabase + M_REG(ST1, ch), st1);
2146
2147#ifdef PC300_DEBUG_INTR
2148 printk("sca_intr: MSCI intr chan[%d] (st=0x%08lx, st1=0x%02x)\n",
2149 ch, status, st1);
2150#endif
2151 if (st1 & ST1_CDCD) {
2152 if (cpc_readb(scabase + M_REG(ST3, ch)) & ST3_DCD) {
2153 printk ("%s: DCD is OFF. Going administrative down.\n",
2154 dev->name);
2155#ifdef CONFIG_PC300_MLPPP
2156 if (chan->conf.proto != PC300_PROTO_MLPPP) {
2157 netif_carrier_off(dev);
2158 }
2159#else
2160 netif_carrier_off(dev);
2161
2162#endif
2163 card->chan[ch].d.line_off++;
2164 } else {
2165 printk ("%s: DCD is ON. Going administrative up.\n",
2166 dev->name);
2167#ifdef CONFIG_PC300_MLPPP
2168 if (chan->conf.proto != PC300_PROTO_MLPPP)
2169
2170#endif
2171 netif_carrier_on(dev);
2172 card->chan[ch].d.line_on++;
2173 }
2174 }
2175 }
2176 spin_unlock(&card->card_lock);
2177 }
2178 if (++intr_count == 10)
2179
2180 break;
2181 }
2182}
2183
2184static void falc_t1_loop_detection(pc300_t * card, int ch, ucchar frs1)
2185{
2186 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
2187 falc_t *pfalc = (falc_t *) & chan->falc;
2188 void __iomem *falcbase = card->hw.falcbase;
2189
2190 if (((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_XPRBS) == 0) &&
2191 !pfalc->loop_gen) {
2192 if (frs1 & FRS1_LLBDD) {
2193
2194 if (pfalc->loop_active) {
2195 falc_remote_loop(card, ch, 0);
2196 }
2197 } else {
2198 if ((frs1 & FRS1_LLBAD) &&
2199 ((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) == 0)) {
2200
2201 if (!pfalc->loop_active) {
2202 falc_remote_loop(card, ch, 1);
2203 }
2204 }
2205 }
2206 }
2207}
2208
2209static void falc_e1_loop_detection(pc300_t * card, int ch, ucchar rsp)
2210{
2211 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
2212 falc_t *pfalc = (falc_t *) & chan->falc;
2213 void __iomem *falcbase = card->hw.falcbase;
2214
2215 if (((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_XPRBS) == 0) &&
2216 !pfalc->loop_gen) {
2217 if (rsp & RSP_LLBDD) {
2218
2219 if (pfalc->loop_active) {
2220 falc_remote_loop(card, ch, 0);
2221 }
2222 } else {
2223 if ((rsp & RSP_LLBAD) &&
2224 ((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) == 0)) {
2225
2226 if (!pfalc->loop_active) {
2227 falc_remote_loop(card, ch, 1);
2228 }
2229 }
2230 }
2231 }
2232}
2233
2234static void falc_t1_intr(pc300_t * card, int ch)
2235{
2236 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
2237 falc_t *pfalc = (falc_t *) & chan->falc;
2238 void __iomem *falcbase = card->hw.falcbase;
2239 ucchar isr0, isr3, gis;
2240 ucchar dummy;
2241
2242 while ((gis = cpc_readb(falcbase + F_REG(GIS, ch))) != 0) {
2243 if (gis & GIS_ISR0) {
2244 isr0 = cpc_readb(falcbase + F_REG(FISR0, ch));
2245 if (isr0 & FISR0_PDEN) {
2246
2247 if (cpc_readb(falcbase + F_REG(FRS1, ch)) &
2248 FRS1_PDEN) {
2249 pfalc->pden++;
2250 }
2251 }
2252 }
2253
2254 if (gis & GIS_ISR1) {
2255 dummy = cpc_readb(falcbase + F_REG(FISR1, ch));
2256 }
2257
2258 if (gis & GIS_ISR2) {
2259 dummy = cpc_readb(falcbase + F_REG(FISR2, ch));
2260 }
2261
2262 if (gis & GIS_ISR3) {
2263 isr3 = cpc_readb(falcbase + F_REG(FISR3, ch));
2264 if (isr3 & FISR3_SEC) {
2265 pfalc->sec++;
2266 falc_update_stats(card, ch);
2267 falc_check_status(card, ch,
2268 cpc_readb(falcbase + F_REG(FRS0, ch)));
2269 }
2270 if (isr3 & FISR3_ES) {
2271 pfalc->es++;
2272 }
2273 if (isr3 & FISR3_LLBSC) {
2274 falc_t1_loop_detection(card, ch,
2275 cpc_readb(falcbase + F_REG(FRS1, ch)));
2276 }
2277 }
2278 }
2279}
2280
2281static void falc_e1_intr(pc300_t * card, int ch)
2282{
2283 pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
2284 falc_t *pfalc = (falc_t *) & chan->falc;
2285 void __iomem *falcbase = card->hw.falcbase;
2286 ucchar isr1, isr2, isr3, gis, rsp;
2287 ucchar dummy;
2288
2289 while ((gis = cpc_readb(falcbase + F_REG(GIS, ch))) != 0) {
2290 rsp = cpc_readb(falcbase + F_REG(RSP, ch));
2291
2292 if (gis & GIS_ISR0) {
2293 dummy = cpc_readb(falcbase + F_REG(FISR0, ch));
2294 }
2295 if (gis & GIS_ISR1) {
2296 isr1 = cpc_readb(falcbase + F_REG(FISR1, ch));
2297 if (isr1 & FISR1_XMB) {
2298 if ((pfalc->xmb_cause & 2)
2299 && pfalc->multiframe_mode) {
2300 if (cpc_readb (falcbase + F_REG(FRS0, ch)) &
2301 (FRS0_LOS | FRS0_AIS | FRS0_LFA)) {
2302 cpc_writeb(falcbase + F_REG(XSP, ch),
2303 cpc_readb(falcbase + F_REG(XSP, ch))
2304 & ~XSP_AXS);
2305 } else {
2306 cpc_writeb(falcbase + F_REG(XSP, ch),
2307 cpc_readb(falcbase + F_REG(XSP, ch))
2308 | XSP_AXS);
2309 }
2310 }
2311 pfalc->xmb_cause = 0;
2312 cpc_writeb(falcbase + F_REG(IMR1, ch),
2313 cpc_readb(falcbase + F_REG(IMR1, ch)) | IMR1_XMB);
2314 }
2315 if (isr1 & FISR1_LLBSC) {
2316 falc_e1_loop_detection(card, ch, rsp);
2317 }
2318 }
2319 if (gis & GIS_ISR2) {
2320 isr2 = cpc_readb(falcbase + F_REG(FISR2, ch));
2321 if (isr2 & FISR2_T400MS) {
2322 cpc_writeb(falcbase + F_REG(XSW, ch),
2323 cpc_readb(falcbase + F_REG(XSW, ch)) | XSW_XRA);
2324 }
2325 if (isr2 & FISR2_MFAR) {
2326 cpc_writeb(falcbase + F_REG(XSW, ch),
2327 cpc_readb(falcbase + F_REG(XSW, ch)) & ~XSW_XRA);
2328 }
2329 if (isr2 & (FISR2_FAR | FISR2_LFA | FISR2_AIS | FISR2_LOS)) {
2330 pfalc->xmb_cause |= 2;
2331 cpc_writeb(falcbase + F_REG(IMR1, ch),
2332 cpc_readb(falcbase + F_REG(IMR1, ch)) & ~IMR1_XMB);
2333 }
2334 }
2335 if (gis & GIS_ISR3) {
2336 isr3 = cpc_readb(falcbase + F_REG(FISR3, ch));
2337 if (isr3 & FISR3_SEC) {
2338 pfalc->sec++;
2339 falc_update_stats(card, ch);
2340 falc_check_status(card, ch,
2341 cpc_readb(falcbase + F_REG(FRS0, ch)));
2342 }
2343 if (isr3 & FISR3_ES) {
2344 pfalc->es++;
2345 }
2346 }
2347 }
2348}
2349
2350static void falc_intr(pc300_t * card)
2351{
2352 int ch;
2353
2354 for (ch = 0; ch < card->hw.nchan; ch++) {
2355 pc300ch_t *chan = &card->chan[ch];
2356 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
2357
2358 if (conf->media == IF_IFACE_T1) {
2359 falc_t1_intr(card, ch);
2360 } else {
2361 falc_e1_intr(card, ch);
2362 }
2363 }
2364}
2365
2366static irqreturn_t cpc_intr(int irq, void *dev_id)
2367{
2368 pc300_t *card = dev_id;
2369 volatile ucchar plx_status;
2370
2371 if (!card) {
2372#ifdef PC300_DEBUG_INTR
2373 printk("cpc_intr: spurious intr %d\n", irq);
2374#endif
2375 return IRQ_NONE;
2376 }
2377
2378 if (!card->hw.rambase) {
2379#ifdef PC300_DEBUG_INTR
2380 printk("cpc_intr: spurious intr2 %d\n", irq);
2381#endif
2382 return IRQ_NONE;
2383 }
2384
2385 switch (card->hw.type) {
2386 case PC300_RSV:
2387 case PC300_X21:
2388 sca_intr(card);
2389 break;
2390
2391 case PC300_TE:
2392 while ( (plx_status = (cpc_readb(card->hw.plxbase + card->hw.intctl_reg) &
2393 (PLX_9050_LINT1_STATUS | PLX_9050_LINT2_STATUS))) != 0) {
2394 if (plx_status & PLX_9050_LINT1_STATUS) {
2395 sca_intr(card);
2396 }
2397 if (plx_status & PLX_9050_LINT2_STATUS) {
2398 falc_intr(card);
2399 }
2400 }
2401 break;
2402 }
2403 return IRQ_HANDLED;
2404}
2405
2406static void cpc_sca_status(pc300_t * card, int ch)
2407{
2408 ucchar ilar;
2409 void __iomem *scabase = card->hw.scabase;
2410 unsigned long flags;
2411
2412 tx_dma_buf_check(card, ch);
2413 rx_dma_buf_check(card, ch);
2414 ilar = cpc_readb(scabase + ILAR);
2415 printk ("ILAR=0x%02x, WCRL=0x%02x, PCR=0x%02x, BTCR=0x%02x, BOLR=0x%02x\n",
2416 ilar, cpc_readb(scabase + WCRL), cpc_readb(scabase + PCR),
2417 cpc_readb(scabase + BTCR), cpc_readb(scabase + BOLR));
2418 printk("TX_CDA=0x%08x, TX_EDA=0x%08x\n",
2419 cpc_readl(scabase + DTX_REG(CDAL, ch)),
2420 cpc_readl(scabase + DTX_REG(EDAL, ch)));
2421 printk("RX_CDA=0x%08x, RX_EDA=0x%08x, BFL=0x%04x\n",
2422 cpc_readl(scabase + DRX_REG(CDAL, ch)),
2423 cpc_readl(scabase + DRX_REG(EDAL, ch)),
2424 cpc_readw(scabase + DRX_REG(BFLL, ch)));
2425 printk("DMER=0x%02x, DSR_TX=0x%02x, DSR_RX=0x%02x\n",
2426 cpc_readb(scabase + DMER), cpc_readb(scabase + DSR_TX(ch)),
2427 cpc_readb(scabase + DSR_RX(ch)));
2428 printk("DMR_TX=0x%02x, DMR_RX=0x%02x, DIR_TX=0x%02x, DIR_RX=0x%02x\n",
2429 cpc_readb(scabase + DMR_TX(ch)), cpc_readb(scabase + DMR_RX(ch)),
2430 cpc_readb(scabase + DIR_TX(ch)),
2431 cpc_readb(scabase + DIR_RX(ch)));
2432 printk("DCR_TX=0x%02x, DCR_RX=0x%02x, FCT_TX=0x%02x, FCT_RX=0x%02x\n",
2433 cpc_readb(scabase + DCR_TX(ch)), cpc_readb(scabase + DCR_RX(ch)),
2434 cpc_readb(scabase + FCT_TX(ch)),
2435 cpc_readb(scabase + FCT_RX(ch)));
2436 printk("MD0=0x%02x, MD1=0x%02x, MD2=0x%02x, MD3=0x%02x, IDL=0x%02x\n",
2437 cpc_readb(scabase + M_REG(MD0, ch)),
2438 cpc_readb(scabase + M_REG(MD1, ch)),
2439 cpc_readb(scabase + M_REG(MD2, ch)),
2440 cpc_readb(scabase + M_REG(MD3, ch)),
2441 cpc_readb(scabase + M_REG(IDL, ch)));
2442 printk("CMD=0x%02x, SA0=0x%02x, SA1=0x%02x, TFN=0x%02x, CTL=0x%02x\n",
2443 cpc_readb(scabase + M_REG(CMD, ch)),
2444 cpc_readb(scabase + M_REG(SA0, ch)),
2445 cpc_readb(scabase + M_REG(SA1, ch)),
2446 cpc_readb(scabase + M_REG(TFN, ch)),
2447 cpc_readb(scabase + M_REG(CTL, ch)));
2448 printk("ST0=0x%02x, ST1=0x%02x, ST2=0x%02x, ST3=0x%02x, ST4=0x%02x\n",
2449 cpc_readb(scabase + M_REG(ST0, ch)),
2450 cpc_readb(scabase + M_REG(ST1, ch)),
2451 cpc_readb(scabase + M_REG(ST2, ch)),
2452 cpc_readb(scabase + M_REG(ST3, ch)),
2453 cpc_readb(scabase + M_REG(ST4, ch)));
2454 printk ("CST0=0x%02x, CST1=0x%02x, CST2=0x%02x, CST3=0x%02x, FST=0x%02x\n",
2455 cpc_readb(scabase + M_REG(CST0, ch)),
2456 cpc_readb(scabase + M_REG(CST1, ch)),
2457 cpc_readb(scabase + M_REG(CST2, ch)),
2458 cpc_readb(scabase + M_REG(CST3, ch)),
2459 cpc_readb(scabase + M_REG(FST, ch)));
2460 printk("TRC0=0x%02x, TRC1=0x%02x, RRC=0x%02x, TBN=0x%02x, RBN=0x%02x\n",
2461 cpc_readb(scabase + M_REG(TRC0, ch)),
2462 cpc_readb(scabase + M_REG(TRC1, ch)),
2463 cpc_readb(scabase + M_REG(RRC, ch)),
2464 cpc_readb(scabase + M_REG(TBN, ch)),
2465 cpc_readb(scabase + M_REG(RBN, ch)));
2466 printk("TFS=0x%02x, TNR0=0x%02x, TNR1=0x%02x, RNR=0x%02x\n",
2467 cpc_readb(scabase + M_REG(TFS, ch)),
2468 cpc_readb(scabase + M_REG(TNR0, ch)),
2469 cpc_readb(scabase + M_REG(TNR1, ch)),
2470 cpc_readb(scabase + M_REG(RNR, ch)));
2471 printk("TCR=0x%02x, RCR=0x%02x, TNR1=0x%02x, RNR=0x%02x\n",
2472 cpc_readb(scabase + M_REG(TCR, ch)),
2473 cpc_readb(scabase + M_REG(RCR, ch)),
2474 cpc_readb(scabase + M_REG(TNR1, ch)),
2475 cpc_readb(scabase + M_REG(RNR, ch)));
2476 printk("TXS=0x%02x, RXS=0x%02x, EXS=0x%02x, TMCT=0x%02x, TMCR=0x%02x\n",
2477 cpc_readb(scabase + M_REG(TXS, ch)),
2478 cpc_readb(scabase + M_REG(RXS, ch)),
2479 cpc_readb(scabase + M_REG(EXS, ch)),
2480 cpc_readb(scabase + M_REG(TMCT, ch)),
2481 cpc_readb(scabase + M_REG(TMCR, ch)));
2482 printk("IE0=0x%02x, IE1=0x%02x, IE2=0x%02x, IE4=0x%02x, FIE=0x%02x\n",
2483 cpc_readb(scabase + M_REG(IE0, ch)),
2484 cpc_readb(scabase + M_REG(IE1, ch)),
2485 cpc_readb(scabase + M_REG(IE2, ch)),
2486 cpc_readb(scabase + M_REG(IE4, ch)),
2487 cpc_readb(scabase + M_REG(FIE, ch)));
2488 printk("IER0=0x%08x\n", cpc_readl(scabase + IER0));
2489
2490 if (ilar != 0) {
2491 CPC_LOCK(card, flags);
2492 cpc_writeb(scabase + ILAR, ilar);
2493 cpc_writeb(scabase + DMER, 0x80);
2494 CPC_UNLOCK(card, flags);
2495 }
2496}
2497
2498static void cpc_falc_status(pc300_t * card, int ch)
2499{
2500 pc300ch_t *chan = &card->chan[ch];
2501 falc_t *pfalc = (falc_t *) & chan->falc;
2502 unsigned long flags;
2503
2504 CPC_LOCK(card, flags);
2505 printk("CH%d: %s %s %d channels\n",
2506 ch, (pfalc->sync ? "SYNC" : ""), (pfalc->active ? "ACTIVE" : ""),
2507 pfalc->num_channels);
2508
2509 printk(" pden=%d, los=%d, losr=%d, lfa=%d, farec=%d\n",
2510 pfalc->pden, pfalc->los, pfalc->losr, pfalc->lfa, pfalc->farec);
2511 printk(" lmfa=%d, ais=%d, sec=%d, es=%d, rai=%d\n",
2512 pfalc->lmfa, pfalc->ais, pfalc->sec, pfalc->es, pfalc->rai);
2513 printk(" bec=%d, fec=%d, cvc=%d, cec=%d, ebc=%d\n",
2514 pfalc->bec, pfalc->fec, pfalc->cvc, pfalc->cec, pfalc->ebc);
2515
2516 printk("\n");
2517 printk(" STATUS: %s %s %s %s %s %s\n",
2518 (pfalc->red_alarm ? "RED" : ""),
2519 (pfalc->blue_alarm ? "BLU" : ""),
2520 (pfalc->yellow_alarm ? "YEL" : ""),
2521 (pfalc->loss_fa ? "LFA" : ""),
2522 (pfalc->loss_mfa ? "LMF" : ""), (pfalc->prbs ? "PRB" : ""));
2523 CPC_UNLOCK(card, flags);
2524}
2525
2526static int cpc_change_mtu(struct net_device *dev, int new_mtu)
2527{
2528 if ((new_mtu < 128) || (new_mtu > PC300_DEF_MTU))
2529 return -EINVAL;
2530 dev->mtu = new_mtu;
2531 return 0;
2532}
2533
2534static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2535{
2536 pc300dev_t *d = (pc300dev_t *) dev->priv;
2537 pc300ch_t *chan = (pc300ch_t *) d->chan;
2538 pc300_t *card = (pc300_t *) chan->card;
2539 pc300conf_t conf_aux;
2540 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
2541 int ch = chan->channel;
2542 void __user *arg = ifr->ifr_data;
2543 struct if_settings *settings = &ifr->ifr_settings;
2544 void __iomem *scabase = card->hw.scabase;
2545
2546 if (!capable(CAP_NET_ADMIN))
2547 return -EPERM;
2548
2549 switch (cmd) {
2550 case SIOCGPC300CONF:
2551#ifdef CONFIG_PC300_MLPPP
2552 if (conf->proto != PC300_PROTO_MLPPP) {
2553 conf->proto = 0;
2554 }
2555#else
2556 conf->proto = 0;
2557#endif
2558 memcpy(&conf_aux.conf, conf, sizeof(pc300chconf_t));
2559 memcpy(&conf_aux.hw, &card->hw, sizeof(pc300hw_t));
2560 if (!arg ||
2561 copy_to_user(arg, &conf_aux, sizeof(pc300conf_t)))
2562 return -EINVAL;
2563 return 0;
2564 case SIOCSPC300CONF:
2565 if (!capable(CAP_NET_ADMIN))
2566 return -EPERM;
2567 if (!arg ||
2568 copy_from_user(&conf_aux.conf, arg, sizeof(pc300chconf_t)))
2569 return -EINVAL;
2570 if (card->hw.cpld_id < 0x02 &&
2571 conf_aux.conf.fr_mode == PC300_FR_UNFRAMED) {
2572
2573 return -EINVAL;
2574 }
2575#ifdef CONFIG_PC300_MLPPP
2576 if (conf_aux.conf.proto == PC300_PROTO_MLPPP) {
2577 if (conf->proto != PC300_PROTO_MLPPP) {
2578 memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t));
2579 cpc_tty_init(d);
2580 }
2581 } else {
2582 if (conf_aux.conf.proto == 0xffff) {
2583 if (conf->proto == PC300_PROTO_MLPPP){
2584
2585 cpc_close(dev);
2586 }
2587 } else {
2588 memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t));
2589
2590 }
2591 }
2592#else
2593 memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t));
2594
2595#endif
2596 return 0;
2597 case SIOCGPC300STATUS:
2598 cpc_sca_status(card, ch);
2599 return 0;
2600 case SIOCGPC300FALCSTATUS:
2601 cpc_falc_status(card, ch);
2602 return 0;
2603
2604 case SIOCGPC300UTILSTATS:
2605 {
2606 if (!arg) {
2607 memset(hdlc_stats(dev), 0, sizeof(struct net_device_stats));
2608 if (card->hw.type == PC300_TE) {
2609 memset(&chan->falc, 0, sizeof(falc_t));
2610 }
2611 } else {
2612 pc300stats_t pc300stats;
2613
2614 memset(&pc300stats, 0, sizeof(pc300stats_t));
2615 pc300stats.hw_type = card->hw.type;
2616 pc300stats.line_on = card->chan[ch].d.line_on;
2617 pc300stats.line_off = card->chan[ch].d.line_off;
2618 memcpy(&pc300stats.gen_stats, hdlc_stats(dev),
2619 sizeof(struct net_device_stats));
2620 if (card->hw.type == PC300_TE)
2621 memcpy(&pc300stats.te_stats,&chan->falc,sizeof(falc_t));
2622 if (copy_to_user(arg, &pc300stats, sizeof(pc300stats_t)))
2623 return -EFAULT;
2624 }
2625 return 0;
2626 }
2627
2628 case SIOCGPC300UTILSTATUS:
2629 {
2630 struct pc300status pc300status;
2631
2632 pc300status.hw_type = card->hw.type;
2633 if (card->hw.type == PC300_TE) {
2634 pc300status.te_status.sync = chan->falc.sync;
2635 pc300status.te_status.red_alarm = chan->falc.red_alarm;
2636 pc300status.te_status.blue_alarm = chan->falc.blue_alarm;
2637 pc300status.te_status.loss_fa = chan->falc.loss_fa;
2638 pc300status.te_status.yellow_alarm =chan->falc.yellow_alarm;
2639 pc300status.te_status.loss_mfa = chan->falc.loss_mfa;
2640 pc300status.te_status.prbs = chan->falc.prbs;
2641 } else {
2642 pc300status.gen_status.dcd =
2643 !(cpc_readb (scabase + M_REG(ST3, ch)) & ST3_DCD);
2644 pc300status.gen_status.cts =
2645 !(cpc_readb (scabase + M_REG(ST3, ch)) & ST3_CTS);
2646 pc300status.gen_status.rts =
2647 !(cpc_readb (scabase + M_REG(CTL, ch)) & CTL_RTS);
2648 pc300status.gen_status.dtr =
2649 !(cpc_readb (scabase + M_REG(CTL, ch)) & CTL_DTR);
2650
2651 }
2652 if (!arg
2653 || copy_to_user(arg, &pc300status, sizeof(pc300status_t)))
2654 return -EINVAL;
2655 return 0;
2656 }
2657
2658 case SIOCSPC300TRACE:
2659
2660 if (!arg || copy_from_user(&d->trace_on, arg,sizeof(unsigned char)))
2661 return -EINVAL;
2662 return 0;
2663
2664 case SIOCSPC300LOOPBACK:
2665 {
2666 struct pc300loopback pc300loop;
2667
2668
2669 if (card->hw.type != PC300_TE)
2670 return -EINVAL;
2671
2672 if (!arg ||
2673 copy_from_user(&pc300loop, arg, sizeof(pc300loopback_t)))
2674 return -EINVAL;
2675 switch (pc300loop.loop_type) {
2676 case PC300LOCLOOP:
2677 falc_local_loop(card, ch, pc300loop.loop_on);
2678 return 0;
2679
2680 case PC300REMLOOP:
2681 falc_remote_loop(card, ch, pc300loop.loop_on);
2682 return 0;
2683
2684 case PC300PAYLOADLOOP:
2685 falc_payload_loop(card, ch, pc300loop.loop_on);
2686 return 0;
2687
2688 case PC300GENLOOPUP:
2689 if (pc300loop.loop_on) {
2690 falc_generate_loop_up_code (card, ch);
2691 } else {
2692 turn_off_xlu(card, ch);
2693 }
2694 return 0;
2695
2696 case PC300GENLOOPDOWN:
2697 if (pc300loop.loop_on) {
2698 falc_generate_loop_down_code (card, ch);
2699 } else {
2700 turn_off_xld(card, ch);
2701 }
2702 return 0;
2703
2704 default:
2705 return -EINVAL;
2706 }
2707 }
2708
2709 case SIOCSPC300PATTERNTEST:
2710
2711 {
2712 struct pc300patterntst pc300patrntst;
2713
2714
2715 if (card->hw.type != PC300_TE)
2716 return -EINVAL;
2717
2718 if (card->hw.cpld_id < 0x02) {
2719
2720 return -EINVAL;
2721 }
2722
2723 if (!arg ||
2724 copy_from_user(&pc300patrntst,arg,sizeof(pc300patterntst_t)))
2725 return -EINVAL;
2726 if (pc300patrntst.patrntst_on == 2) {
2727 if (chan->falc.prbs == 0) {
2728 falc_pattern_test(card, ch, 1);
2729 }
2730 pc300patrntst.num_errors =
2731 falc_pattern_test_error(card, ch);
2732 if (!arg
2733 || copy_to_user(arg, &pc300patrntst,
2734 sizeof (pc300patterntst_t)))
2735 return -EINVAL;
2736 } else {
2737 falc_pattern_test(card, ch, pc300patrntst.patrntst_on);
2738 }
2739 return 0;
2740 }
2741
2742 case SIOCWANDEV:
2743 switch (ifr->ifr_settings.type) {
2744 case IF_GET_IFACE:
2745 {
2746 const size_t size = sizeof(sync_serial_settings);
2747 ifr->ifr_settings.type = conf->media;
2748 if (ifr->ifr_settings.size < size) {
2749
2750 ifr->ifr_settings.size = size;
2751 return -ENOBUFS;
2752 }
2753
2754 if (copy_to_user(settings->ifs_ifsu.sync,
2755 &conf->phys_settings, size)) {
2756 return -EFAULT;
2757 }
2758 return 0;
2759 }
2760
2761 case IF_IFACE_V35:
2762 case IF_IFACE_V24:
2763 case IF_IFACE_X21:
2764 {
2765 const size_t size = sizeof(sync_serial_settings);
2766
2767 if (!capable(CAP_NET_ADMIN)) {
2768 return -EPERM;
2769 }
2770
2771 if (ifr->ifr_settings.size != size) {
2772 return -ENOBUFS;
2773 }
2774
2775 if (copy_from_user(&conf->phys_settings,
2776 settings->ifs_ifsu.sync, size)) {
2777 return -EFAULT;
2778 }
2779
2780 if (conf->phys_settings.loopback) {
2781 cpc_writeb(card->hw.scabase + M_REG(MD2, ch),
2782 cpc_readb(card->hw.scabase + M_REG(MD2, ch)) |
2783 MD2_LOOP_MIR);
2784 }
2785 conf->media = ifr->ifr_settings.type;
2786 return 0;
2787 }
2788
2789 case IF_IFACE_T1:
2790 case IF_IFACE_E1:
2791 {
2792 const size_t te_size = sizeof(te1_settings);
2793 const size_t size = sizeof(sync_serial_settings);
2794
2795 if (!capable(CAP_NET_ADMIN)) {
2796 return -EPERM;
2797 }
2798
2799
2800 if (ifr->ifr_settings.size != te_size) {
2801 return -ENOBUFS;
2802 }
2803
2804 if (copy_from_user(&conf->phys_settings,
2805 settings->ifs_ifsu.te1, size)) {
2806 return -EFAULT;
2807 }
2808
2809 if (conf->phys_settings.loopback) {
2810 cpc_writeb(card->hw.scabase + M_REG(MD2, ch),
2811 cpc_readb(card->hw.scabase + M_REG(MD2, ch)) |
2812 MD2_LOOP_MIR);
2813 }
2814 conf->media = ifr->ifr_settings.type;
2815 return 0;
2816 }
2817 default:
2818 return hdlc_ioctl(dev, ifr, cmd);
2819 }
2820
2821 default:
2822 return hdlc_ioctl(dev, ifr, cmd);
2823 }
2824}
2825
2826static struct net_device_stats *cpc_get_stats(struct net_device *dev)
2827{
2828 return hdlc_stats(dev);
2829}
2830
2831static int clock_rate_calc(uclong rate, uclong clock, int *br_io)
2832{
2833 int br, tc;
2834 int br_pwr, error;
2835
2836 *br_io = 0;
2837
2838 if (rate == 0)
2839 return (0);
2840
2841 for (br = 0, br_pwr = 1; br <= 9; br++, br_pwr <<= 1) {
2842 if ((tc = clock / br_pwr / rate) <= 0xff) {
2843 *br_io = br;
2844 break;
2845 }
2846 }
2847
2848 if (tc <= 0xff) {
2849 error = ((rate - (clock / br_pwr / rate)) / rate) * 1000;
2850
2851 if (error < -10 || error > 10)
2852 return (-1);
2853 else
2854 return (tc);
2855 } else {
2856 return (-1);
2857 }
2858}
2859
2860static int ch_config(pc300dev_t * d)
2861{
2862 pc300ch_t *chan = (pc300ch_t *) d->chan;
2863 pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
2864 pc300_t *card = (pc300_t *) chan->card;
2865 void __iomem *scabase = card->hw.scabase;
2866 void __iomem *plxbase = card->hw.plxbase;
2867 int ch = chan->channel;
2868 uclong clkrate = chan->conf.phys_settings.clock_rate;
2869 uclong clktype = chan->conf.phys_settings.clock_type;
2870 ucshort encoding = chan->conf.proto_settings.encoding;
2871 ucshort parity = chan->conf.proto_settings.parity;
2872 ucchar md0, md2;
2873
2874
2875 cpc_writeb(scabase + M_REG(CMD, ch), CMD_CH_RST);
2876
2877
2878 switch (parity) {
2879 case PARITY_NONE:
2880 md0 = MD0_BIT_SYNC;
2881 break;
2882 case PARITY_CRC16_PR0:
2883 md0 = MD0_CRC16_0|MD0_CRCC0|MD0_BIT_SYNC;
2884 break;
2885 case PARITY_CRC16_PR1:
2886 md0 = MD0_CRC16_1|MD0_CRCC0|MD0_BIT_SYNC;
2887 break;
2888 case PARITY_CRC32_PR1_CCITT:
2889 md0 = MD0_CRC32|MD0_CRCC0|MD0_BIT_SYNC;
2890 break;
2891 case PARITY_CRC16_PR1_CCITT:
2892 default:
2893 md0 = MD0_CRC_CCITT|MD0_CRCC0|MD0_BIT_SYNC;
2894 break;
2895 }
2896 switch (encoding) {
2897 case ENCODING_NRZI:
2898 md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_NRZI;
2899 break;
2900 case ENCODING_FM_MARK:
2901 md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_FM|MD2_FM1;
2902 break;
2903 case ENCODING_FM_SPACE:
2904 md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_FM|MD2_FM0;
2905 break;
2906 case ENCODING_MANCHESTER:
2907 md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_FM|MD2_MANCH;
2908 break;
2909 case ENCODING_NRZ:
2910 default:
2911 md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_NRZ;
2912 break;
2913 }
2914 cpc_writeb(scabase + M_REG(MD0, ch), md0);
2915 cpc_writeb(scabase + M_REG(MD1, ch), 0);
2916 cpc_writeb(scabase + M_REG(MD2, ch), md2);
2917 cpc_writeb(scabase + M_REG(IDL, ch), 0x7e);
2918 cpc_writeb(scabase + M_REG(CTL, ch), CTL_URSKP | CTL_IDLC);
2919
2920
2921 switch (card->hw.type) {
2922 case PC300_RSV:
2923 if (conf->media == IF_IFACE_V35) {
2924 cpc_writel((plxbase + card->hw.gpioc_reg),
2925 cpc_readl(plxbase + card->hw.gpioc_reg) | PC300_CHMEDIA_MASK(ch));
2926 } else {
2927 cpc_writel((plxbase + card->hw.gpioc_reg),
2928 cpc_readl(plxbase + card->hw.gpioc_reg) & ~PC300_CHMEDIA_MASK(ch));
2929 }
2930 break;
2931
2932 case PC300_X21:
2933 break;
2934
2935 case PC300_TE:
2936 te_config(card, ch);
2937 break;
2938 }
2939
2940 switch (card->hw.type) {
2941 case PC300_RSV:
2942 case PC300_X21:
2943 if (clktype == CLOCK_INT || clktype == CLOCK_TXINT) {
2944 int tmc, br;
2945
2946
2947 tmc = clock_rate_calc(clkrate, card->hw.clock, &br);
2948 if (tmc < 0)
2949 return -EIO;
2950 cpc_writeb(scabase + M_REG(TMCT, ch), tmc);
2951 cpc_writeb(scabase + M_REG(TXS, ch),
2952 (TXS_DTRXC | TXS_IBRG | br));
2953 if (clktype == CLOCK_INT) {
2954 cpc_writeb(scabase + M_REG(TMCR, ch), tmc);
2955 cpc_writeb(scabase + M_REG(RXS, ch),
2956 (RXS_IBRG | br));
2957 } else {
2958 cpc_writeb(scabase + M_REG(TMCR, ch), 1);
2959 cpc_writeb(scabase + M_REG(RXS, ch), 0);
2960 }
2961 if (card->hw.type == PC300_X21) {
2962 cpc_writeb(scabase + M_REG(GPO, ch), 1);
2963 cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1 | EXS_RES1);
2964 } else {
2965 cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1);
2966 }
2967 } else {
2968 cpc_writeb(scabase + M_REG(TMCT, ch), 1);
2969 if (clktype == CLOCK_EXT) {
2970 cpc_writeb(scabase + M_REG(TXS, ch),
2971 TXS_DTRXC);
2972 } else {
2973 cpc_writeb(scabase + M_REG(TXS, ch),
2974 TXS_DTRXC|TXS_RCLK);
2975 }
2976 cpc_writeb(scabase + M_REG(TMCR, ch), 1);
2977 cpc_writeb(scabase + M_REG(RXS, ch), 0);
2978 if (card->hw.type == PC300_X21) {
2979 cpc_writeb(scabase + M_REG(GPO, ch), 0);
2980 cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1 | EXS_RES1);
2981 } else {
2982 cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1);
2983 }
2984 }
2985 break;
2986
2987 case PC300_TE:
2988
2989 cpc_writeb(scabase + M_REG(TMCT, ch), 1);
2990 cpc_writeb(scabase + M_REG(TXS, ch), 0);
2991 cpc_writeb(scabase + M_REG(TMCR, ch), 1);
2992 cpc_writeb(scabase + M_REG(RXS, ch), 0);
2993 cpc_writeb(scabase + M_REG(EXS, ch), 0);
2994 break;
2995 }
2996
2997
2998 cpc_writel(scabase + IER0,
2999 cpc_readl(scabase + IER0) |
3000 IR0_M(IR0_RXINTA, ch) |
3001 IR0_DRX(IR0_EFT | IR0_DMIA | IR0_DMIB, ch) |
3002 IR0_DTX(IR0_EFT | IR0_DMIA | IR0_DMIB, ch));
3003 cpc_writeb(scabase + M_REG(IE0, ch),
3004 cpc_readl(scabase + M_REG(IE0, ch)) | IE0_RXINTA);
3005 cpc_writeb(scabase + M_REG(IE1, ch),
3006 cpc_readl(scabase + M_REG(IE1, ch)) | IE1_CDCD);
3007
3008 return 0;
3009}
3010
3011static int rx_config(pc300dev_t * d)
3012{
3013 pc300ch_t *chan = (pc300ch_t *) d->chan;
3014 pc300_t *card = (pc300_t *) chan->card;
3015 void __iomem *scabase = card->hw.scabase;
3016 int ch = chan->channel;
3017
3018 cpc_writeb(scabase + DSR_RX(ch), 0);
3019
3020
3021 cpc_writeb(scabase + M_REG(RRC, ch), 0);
3022 cpc_writeb(scabase + M_REG(RNR, ch), 16);
3023
3024
3025 cpc_writeb(scabase + M_REG(CMD, ch), CMD_RX_CRC_INIT);
3026 cpc_writeb(scabase + M_REG(CMD, ch), CMD_RX_ENA);
3027
3028
3029 chan->rx_first_bd = 0;
3030 chan->rx_last_bd = N_DMA_RX_BUF - 1;
3031 rx_dma_buf_init(card, ch);
3032 cpc_writeb(scabase + DCR_RX(ch), DCR_FCT_CLR);
3033 cpc_writeb(scabase + DMR_RX(ch), (DMR_TMOD | DMR_NF));
3034 cpc_writeb(scabase + DIR_RX(ch), (DIR_EOM | DIR_BOF));
3035
3036
3037 rx_dma_start(card, ch);
3038
3039 return 0;
3040}
3041
3042static int tx_config(pc300dev_t * d)
3043{
3044 pc300ch_t *chan = (pc300ch_t *) d->chan;
3045 pc300_t *card = (pc300_t *) chan->card;
3046 void __iomem *scabase = card->hw.scabase;
3047 int ch = chan->channel;
3048
3049 cpc_writeb(scabase + DSR_TX(ch), 0);
3050
3051
3052 cpc_writeb(scabase + M_REG(TRC0, ch), 0);
3053 cpc_writeb(scabase + M_REG(TFS, ch), 32);
3054 cpc_writeb(scabase + M_REG(TNR0, ch), 20);
3055 cpc_writeb(scabase + M_REG(TNR1, ch), 48);
3056 cpc_writeb(scabase + M_REG(TCR, ch), 8);
3057
3058
3059 cpc_writeb(scabase + M_REG(CMD, ch), CMD_TX_CRC_INIT);
3060
3061
3062 chan->tx_first_bd = 0;
3063 chan->tx_next_bd = 0;
3064 tx_dma_buf_init(card, ch);
3065 cpc_writeb(scabase + DCR_TX(ch), DCR_FCT_CLR);
3066 cpc_writeb(scabase + DMR_TX(ch), (DMR_TMOD | DMR_NF));
3067 cpc_writeb(scabase + DIR_TX(ch), (DIR_EOM | DIR_BOF | DIR_UDRF));
3068 cpc_writel(scabase + DTX_REG(CDAL, ch), TX_BD_ADDR(ch, chan->tx_first_bd));
3069 cpc_writel(scabase + DTX_REG(EDAL, ch), TX_BD_ADDR(ch, chan->tx_next_bd));
3070
3071 return 0;
3072}
3073
3074static int cpc_attach(struct net_device *dev, unsigned short encoding,
3075 unsigned short parity)
3076{
3077 pc300dev_t *d = (pc300dev_t *)dev->priv;
3078 pc300ch_t *chan = (pc300ch_t *)d->chan;
3079 pc300_t *card = (pc300_t *)chan->card;
3080 pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
3081
3082 if (card->hw.type == PC300_TE) {
3083 if (encoding != ENCODING_NRZ && encoding != ENCODING_NRZI) {
3084 return -EINVAL;
3085 }
3086 } else {
3087 if (encoding != ENCODING_NRZ && encoding != ENCODING_NRZI &&
3088 encoding != ENCODING_FM_MARK && encoding != ENCODING_FM_SPACE) {
3089
3090 return -EINVAL;
3091 }
3092 }
3093
3094 if (parity != PARITY_NONE && parity != PARITY_CRC16_PR0 &&
3095 parity != PARITY_CRC16_PR1 && parity != PARITY_CRC32_PR1_CCITT &&
3096 parity != PARITY_CRC16_PR1_CCITT) {
3097 return -EINVAL;
3098 }
3099
3100 conf->proto_settings.encoding = encoding;
3101 conf->proto_settings.parity = parity;
3102 return 0;
3103}
3104
3105static int cpc_opench(pc300dev_t * d)
3106{
3107 pc300ch_t *chan = (pc300ch_t *) d->chan;
3108 pc300_t *card = (pc300_t *) chan->card;
3109 int ch = chan->channel, rc;
3110 void __iomem *scabase = card->hw.scabase;
3111
3112 rc = ch_config(d);
3113 if (rc)
3114 return rc;
3115
3116 rx_config(d);
3117
3118 tx_config(d);
3119
3120
3121 cpc_writeb(scabase + M_REG(CTL, ch),
3122 cpc_readb(scabase + M_REG(CTL, ch)) & ~(CTL_RTS | CTL_DTR));
3123
3124 return 0;
3125}
3126
3127static void cpc_closech(pc300dev_t * d)
3128{
3129 pc300ch_t *chan = (pc300ch_t *) d->chan;
3130 pc300_t *card = (pc300_t *) chan->card;
3131 falc_t *pfalc = (falc_t *) & chan->falc;
3132 int ch = chan->channel;
3133
3134 cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_CH_RST);
3135 rx_dma_stop(card, ch);
3136 tx_dma_stop(card, ch);
3137
3138 if (card->hw.type == PC300_TE) {
3139 memset(pfalc, 0, sizeof(falc_t));
3140 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
3141 cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) &
3142 ~((CPLD_REG2_FALC_TX_CLK | CPLD_REG2_FALC_RX_CLK |
3143 CPLD_REG2_FALC_LED2) << (2 * ch)));
3144
3145 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
3146 cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) |
3147 (CPLD_REG1_FALC_RESET << (2 * ch)));
3148 udelay(10000);
3149 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
3150 cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) &
3151 ~(CPLD_REG1_FALC_RESET << (2 * ch)));
3152 }
3153}
3154
3155int cpc_open(struct net_device *dev)
3156{
3157 pc300dev_t *d = (pc300dev_t *) dev->priv;
3158 struct ifreq ifr;
3159 int result;
3160
3161#ifdef PC300_DEBUG_OTHER
3162 printk("pc300: cpc_open");
3163#endif
3164
3165#ifdef FIXME
3166 if (hdlc->proto.id == IF_PROTO_PPP) {
3167 d->if_ptr = &hdlc->state.ppp.pppdev;
3168 }
3169#endif
3170
3171 result = hdlc_open(dev);
3172 if ( 0) {
3173 dev->priv = d;
3174 }
3175 if (result) {
3176 return result;
3177 }
3178
3179 sprintf(ifr.ifr_name, "%s", dev->name);
3180 result = cpc_opench(d);
3181 if (result)
3182 goto err_out;
3183
3184 netif_start_queue(dev);
3185 return 0;
3186
3187err_out:
3188 hdlc_close(dev);
3189 return result;
3190}
3191
3192static int cpc_close(struct net_device *dev)
3193{
3194 pc300dev_t *d = (pc300dev_t *) dev->priv;
3195 pc300ch_t *chan = (pc300ch_t *) d->chan;
3196 pc300_t *card = (pc300_t *) chan->card;
3197 unsigned long flags;
3198
3199#ifdef PC300_DEBUG_OTHER
3200 printk("pc300: cpc_close");
3201#endif
3202
3203 netif_stop_queue(dev);
3204
3205 CPC_LOCK(card, flags);
3206 cpc_closech(d);
3207 CPC_UNLOCK(card, flags);
3208
3209 hdlc_close(dev);
3210 if ( 0) {
3211 d->if_ptr = NULL;
3212 }
3213#ifdef CONFIG_PC300_MLPPP
3214 if (chan->conf.proto == PC300_PROTO_MLPPP) {
3215 cpc_tty_unregister_service(d);
3216 chan->conf.proto = 0xffff;
3217 }
3218#endif
3219
3220 return 0;
3221}
3222
3223static uclong detect_ram(pc300_t * card)
3224{
3225 uclong i;
3226 ucchar data;
3227 void __iomem *rambase = card->hw.rambase;
3228
3229 card->hw.ramsize = PC300_RAMSIZE;
3230
3231 for (i = 0; i < card->hw.ramsize; i++) {
3232 data = (ucchar) (i & 0xff);
3233 cpc_writeb(rambase + i, data);
3234 if (cpc_readb(rambase + i) != data) {
3235 break;
3236 }
3237 }
3238 return (i);
3239}
3240
3241static void plx_init(pc300_t * card)
3242{
3243 struct RUNTIME_9050 __iomem *plx_ctl = card->hw.plxbase;
3244
3245
3246 cpc_writel(&plx_ctl->init_ctrl,
3247 cpc_readl(&plx_ctl->init_ctrl) | 0x40000000);
3248 udelay(10000L);
3249 cpc_writel(&plx_ctl->init_ctrl,
3250 cpc_readl(&plx_ctl->init_ctrl) & ~0x40000000);
3251
3252
3253 cpc_writel(&plx_ctl->init_ctrl,
3254 cpc_readl(&plx_ctl->init_ctrl) | 0x20000000);
3255 udelay(10000L);
3256 cpc_writel(&plx_ctl->init_ctrl,
3257 cpc_readl(&plx_ctl->init_ctrl) & ~0x20000000);
3258
3259}
3260
3261static inline void show_version(void)
3262{
3263 char *rcsvers, *rcsdate, *tmp;
3264
3265 rcsvers = strchr(rcsid, ' ');
3266 rcsvers++;
3267 tmp = strchr(rcsvers, ' ');
3268 *tmp++ = '\0';
3269 rcsdate = strchr(tmp, ' ');
3270 rcsdate++;
3271 tmp = strrchr(rcsdate, ' ');
3272 *tmp = '\0';
3273 printk(KERN_INFO "Cyclades-PC300 driver %s %s (built %s %s)\n",
3274 rcsvers, rcsdate, __DATE__, __TIME__);
3275}
3276
3277static void cpc_init_card(pc300_t * card)
3278{
3279 int i, devcount = 0;
3280 static int board_nbr = 1;
3281
3282
3283 plx_init(card);
3284 cpc_writew(card->hw.plxbase + card->hw.intctl_reg,
3285 cpc_readw(card->hw.plxbase + card->hw.intctl_reg) | 0x0040);
3286
3287#ifdef USE_PCI_CLOCK
3288
3289 cpc_writel(card->hw.plxbase + card->hw.gpioc_reg,
3290 cpc_readl(card->hw.plxbase + card->hw.gpioc_reg) | 0x00000004UL);
3291 card->hw.clock = PC300_PCI_CLOCK;
3292#else
3293
3294 cpc_writel(card->hw.plxbase + card->hw.gpioc_reg,
3295 cpc_readl(card->hw.plxbase + card->hw.gpioc_reg) & ~0x00000004UL);
3296 card->hw.clock = PC300_OSC_CLOCK;
3297#endif
3298
3299
3300 card->hw.ramsize = detect_ram(card);
3301
3302
3303 cpc_writeb(card->hw.scabase + PCR, PCR_PR2);
3304 cpc_writeb(card->hw.scabase + BTCR, 0x10);
3305 cpc_writeb(card->hw.scabase + WCRL, 0);
3306 cpc_writeb(card->hw.scabase + DMER, 0x80);
3307
3308 if (card->hw.type == PC300_TE) {
3309 ucchar reg1;
3310
3311
3312 reg1 = cpc_readb(card->hw.falcbase + CPLD_REG1);
3313 cpc_writeb(card->hw.falcbase + CPLD_REG1, (reg1 + 0x5a));
3314 if (cpc_readb(card->hw.falcbase + CPLD_REG1) == reg1) {
3315
3316 card->hw.cpld_id = cpc_readb(card->hw.falcbase + CPLD_ID_REG);
3317 card->hw.cpld_reg1 = CPLD_V2_REG1;
3318 card->hw.cpld_reg2 = CPLD_V2_REG2;
3319 } else {
3320
3321 card->hw.cpld_id = 0;
3322 card->hw.cpld_reg1 = CPLD_REG1;
3323 card->hw.cpld_reg2 = CPLD_REG2;
3324 cpc_writeb(card->hw.falcbase + CPLD_REG1, reg1);
3325 }
3326
3327
3328 cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
3329 cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) |
3330 CPLD_REG1_GLOBAL_CLK);
3331
3332 }
3333
3334 for (i = 0; i < card->hw.nchan; i++) {
3335 pc300ch_t *chan = &card->chan[i];
3336 pc300dev_t *d = &chan->d;
3337 hdlc_device *hdlc;
3338 struct net_device *dev;
3339
3340 chan->card = card;
3341 chan->channel = i;
3342 chan->conf.phys_settings.clock_rate = 0;
3343 chan->conf.phys_settings.clock_type = CLOCK_EXT;
3344 chan->conf.proto_settings.encoding = ENCODING_NRZ;
3345 chan->conf.proto_settings.parity = PARITY_CRC16_PR1_CCITT;
3346 switch (card->hw.type) {
3347 case PC300_TE:
3348 chan->conf.media = IF_IFACE_T1;
3349 chan->conf.lcode = PC300_LC_B8ZS;
3350 chan->conf.fr_mode = PC300_FR_ESF;
3351 chan->conf.lbo = PC300_LBO_0_DB;
3352 chan->conf.rx_sens = PC300_RX_SENS_SH;
3353 chan->conf.tslot_bitmap = 0xffffffffUL;
3354 break;
3355
3356 case PC300_X21:
3357 chan->conf.media = IF_IFACE_X21;
3358 break;
3359
3360 case PC300_RSV:
3361 default:
3362 chan->conf.media = IF_IFACE_V35;
3363 break;
3364 }
3365 chan->conf.proto = IF_PROTO_PPP;
3366 chan->tx_first_bd = 0;
3367 chan->tx_next_bd = 0;
3368 chan->rx_first_bd = 0;
3369 chan->rx_last_bd = N_DMA_RX_BUF - 1;
3370 chan->nfree_tx_bd = N_DMA_TX_BUF;
3371
3372 d->chan = chan;
3373 d->tx_skb = NULL;
3374 d->trace_on = 0;
3375 d->line_on = 0;
3376 d->line_off = 0;
3377
3378 dev = alloc_hdlcdev(NULL);
3379 if (dev == NULL)
3380 continue;
3381
3382 hdlc = dev_to_hdlc(dev);
3383 hdlc->xmit = cpc_queue_xmit;
3384 hdlc->attach = cpc_attach;
3385 d->dev = dev;
3386 dev->mem_start = card->hw.ramphys;
3387 dev->mem_end = card->hw.ramphys + card->hw.ramsize - 1;
3388 dev->irq = card->hw.irq;
3389 dev->init = NULL;
3390 dev->tx_queue_len = PC300_TX_QUEUE_LEN;
3391 dev->mtu = PC300_DEF_MTU;
3392
3393 dev->open = cpc_open;
3394 dev->stop = cpc_close;
3395 dev->tx_timeout = cpc_tx_timeout;
3396 dev->watchdog_timeo = PC300_TX_TIMEOUT;
3397 dev->get_stats = cpc_get_stats;
3398 dev->set_multicast_list = NULL;
3399 dev->set_mac_address = NULL;
3400 dev->change_mtu = cpc_change_mtu;
3401 dev->do_ioctl = cpc_ioctl;
3402
3403 if (register_hdlc_device(dev) == 0) {
3404 dev->priv = d;
3405 printk("%s: Cyclades-PC300/", dev->name);
3406 switch (card->hw.type) {
3407 case PC300_TE:
3408 if (card->hw.bus == PC300_PMC) {
3409 printk("TE-M");
3410 } else {
3411 printk("TE ");
3412 }
3413 break;
3414
3415 case PC300_X21:
3416 printk("X21 ");
3417 break;
3418
3419 case PC300_RSV:
3420 default:
3421 printk("RSV ");
3422 break;
3423 }
3424 printk (" #%d, %dKB of RAM at 0x%08x, IRQ%d, channel %d.\n",
3425 board_nbr, card->hw.ramsize / 1024,
3426 card->hw.ramphys, card->hw.irq, i + 1);
3427 devcount++;
3428 } else {
3429 printk ("Dev%d on card(0x%08x): unable to allocate i/f name.\n",
3430 i + 1, card->hw.ramphys);
3431 free_netdev(dev);
3432 continue;
3433 }
3434 }
3435 spin_lock_init(&card->card_lock);
3436
3437 board_nbr++;
3438}
3439
3440static int __devinit
3441cpc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
3442{
3443 static int first_time = 1;
3444 int err, eeprom_outdated = 0;
3445 ucshort device_id;
3446 pc300_t *card;
3447
3448 if (first_time) {
3449 first_time = 0;
3450 show_version();
3451#ifdef CONFIG_PC300_MLPPP
3452 cpc_tty_reset_var();
3453#endif
3454 }
3455
3456 if ((err = pci_enable_device(pdev)) < 0)
3457 return err;
3458
3459 card = kzalloc(sizeof(pc300_t), GFP_KERNEL);
3460 if (card == NULL) {
3461 printk("PC300 found at RAM 0x%016llx, "
3462 "but could not allocate card structure.\n",
3463 (unsigned long long)pci_resource_start(pdev, 3));
3464 err = -ENOMEM;
3465 goto err_disable_dev;
3466 }
3467
3468 err = -ENODEV;
3469
3470
3471 device_id = ent->device;
3472 card->hw.irq = pdev->irq;
3473 card->hw.iophys = pci_resource_start(pdev, 1);
3474 card->hw.iosize = pci_resource_len(pdev, 1);
3475 card->hw.scaphys = pci_resource_start(pdev, 2);
3476 card->hw.scasize = pci_resource_len(pdev, 2);
3477 card->hw.ramphys = pci_resource_start(pdev, 3);
3478 card->hw.alloc_ramsize = pci_resource_len(pdev, 3);
3479 card->hw.falcphys = pci_resource_start(pdev, 4);
3480 card->hw.falcsize = pci_resource_len(pdev, 4);
3481 card->hw.plxphys = pci_resource_start(pdev, 5);
3482 card->hw.plxsize = pci_resource_len(pdev, 5);
3483
3484 switch (device_id) {
3485 case PCI_DEVICE_ID_PC300_RX_1:
3486 case PCI_DEVICE_ID_PC300_TE_1:
3487 case PCI_DEVICE_ID_PC300_TE_M_1:
3488 card->hw.nchan = 1;
3489 break;
3490
3491 case PCI_DEVICE_ID_PC300_RX_2:
3492 case PCI_DEVICE_ID_PC300_TE_2:
3493 case PCI_DEVICE_ID_PC300_TE_M_2:
3494 default:
3495 card->hw.nchan = PC300_MAXCHAN;
3496 break;
3497 }
3498#ifdef PC300_DEBUG_PCI
3499 printk("cpc (bus=0x0%x,pci_id=0x%x,", pdev->bus->number, pdev->devfn);
3500 printk("rev_id=%d) IRQ%d\n", pdev->revision, card->hw.irq);
3501 printk("cpc:found ramaddr=0x%08lx plxaddr=0x%08lx "
3502 "ctladdr=0x%08lx falcaddr=0x%08lx\n",
3503 card->hw.ramphys, card->hw.plxphys, card->hw.scaphys,
3504 card->hw.falcphys);
3505#endif
3506
3507
3508
3509 if (!request_region(card->hw.iophys, card->hw.iosize, "PLX Registers")) {
3510
3511 printk("WARNING: couldn't allocate I/O region for PC300 board "
3512 "at 0x%08x!\n", card->hw.ramphys);
3513 }
3514
3515 if (card->hw.plxphys) {
3516 pci_write_config_dword(pdev, PCI_BASE_ADDRESS_0, card->hw.plxphys);
3517 } else {
3518 eeprom_outdated = 1;
3519 card->hw.plxphys = pci_resource_start(pdev, 0);
3520 card->hw.plxsize = pci_resource_len(pdev, 0);
3521 }
3522
3523 if (!request_mem_region(card->hw.plxphys, card->hw.plxsize,
3524 "PLX Registers")) {
3525 printk("PC300 found at RAM 0x%08x, "
3526 "but could not allocate PLX mem region.\n",
3527 card->hw.ramphys);
3528 goto err_release_io;
3529 }
3530 if (!request_mem_region(card->hw.ramphys, card->hw.alloc_ramsize,
3531 "On-board RAM")) {
3532 printk("PC300 found at RAM 0x%08x, "
3533 "but could not allocate RAM mem region.\n",
3534 card->hw.ramphys);
3535 goto err_release_plx;
3536 }
3537 if (!request_mem_region(card->hw.scaphys, card->hw.scasize,
3538 "SCA-II Registers")) {
3539 printk("PC300 found at RAM 0x%08x, "
3540 "but could not allocate SCA mem region.\n",
3541 card->hw.ramphys);
3542 goto err_release_ram;
3543 }
3544
3545 card->hw.plxbase = ioremap(card->hw.plxphys, card->hw.plxsize);
3546 card->hw.rambase = ioremap(card->hw.ramphys, card->hw.alloc_ramsize);
3547 card->hw.scabase = ioremap(card->hw.scaphys, card->hw.scasize);
3548 switch (device_id) {
3549 case PCI_DEVICE_ID_PC300_TE_1:
3550 case PCI_DEVICE_ID_PC300_TE_2:
3551 case PCI_DEVICE_ID_PC300_TE_M_1:
3552 case PCI_DEVICE_ID_PC300_TE_M_2:
3553 request_mem_region(card->hw.falcphys, card->hw.falcsize,
3554 "FALC Registers");
3555 card->hw.falcbase = ioremap(card->hw.falcphys, card->hw.falcsize);
3556 break;
3557
3558 case PCI_DEVICE_ID_PC300_RX_1:
3559 case PCI_DEVICE_ID_PC300_RX_2:
3560 default:
3561 card->hw.falcbase = NULL;
3562 break;
3563 }
3564
3565#ifdef PC300_DEBUG_PCI
3566 printk("cpc: relocate ramaddr=0x%08lx plxaddr=0x%08lx "
3567 "ctladdr=0x%08lx falcaddr=0x%08lx\n",
3568 card->hw.rambase, card->hw.plxbase, card->hw.scabase,
3569 card->hw.falcbase);
3570#endif
3571
3572
3573 pci_set_drvdata(pdev, card);
3574
3575
3576 switch (device_id) {
3577 case PCI_DEVICE_ID_PC300_TE_1:
3578 case PCI_DEVICE_ID_PC300_TE_2:
3579 case PCI_DEVICE_ID_PC300_TE_M_1:
3580 case PCI_DEVICE_ID_PC300_TE_M_2:
3581 card->hw.type = PC300_TE;
3582
3583 if ((device_id == PCI_DEVICE_ID_PC300_TE_M_1) ||
3584 (device_id == PCI_DEVICE_ID_PC300_TE_M_2)) {
3585 card->hw.bus = PC300_PMC;
3586
3587 card->hw.gpioc_reg = 0x54;
3588 card->hw.intctl_reg = 0x4c;
3589 } else {
3590 card->hw.bus = PC300_PCI;
3591
3592 card->hw.gpioc_reg = 0x50;
3593 card->hw.intctl_reg = 0x4c;
3594 }
3595 break;
3596
3597 case PCI_DEVICE_ID_PC300_RX_1:
3598 case PCI_DEVICE_ID_PC300_RX_2:
3599 default:
3600 card->hw.bus = PC300_PCI;
3601
3602 card->hw.gpioc_reg = 0x50;
3603 card->hw.intctl_reg = 0x4c;
3604
3605 if ((cpc_readl(card->hw.plxbase + card->hw.gpioc_reg) & PC300_CTYPE_MASK)) {
3606 card->hw.type = PC300_X21;
3607 } else {
3608 card->hw.type = PC300_RSV;
3609 }
3610 break;
3611 }
3612
3613
3614 if (request_irq(card->hw.irq, cpc_intr, IRQF_SHARED, "Cyclades-PC300", card)) {
3615 printk ("PC300 found at RAM 0x%08x, but could not allocate IRQ%d.\n",
3616 card->hw.ramphys, card->hw.irq);
3617 goto err_io_unmap;
3618 }
3619
3620 cpc_init_card(card);
3621
3622 if (eeprom_outdated)
3623 printk("WARNING: PC300 with outdated EEPROM.\n");
3624 return 0;
3625
3626err_io_unmap:
3627 iounmap(card->hw.plxbase);
3628 iounmap(card->hw.scabase);
3629 iounmap(card->hw.rambase);
3630 if (card->hw.type == PC300_TE) {
3631 iounmap(card->hw.falcbase);
3632 release_mem_region(card->hw.falcphys, card->hw.falcsize);
3633 }
3634 release_mem_region(card->hw.scaphys, card->hw.scasize);
3635err_release_ram:
3636 release_mem_region(card->hw.ramphys, card->hw.alloc_ramsize);
3637err_release_plx:
3638 release_mem_region(card->hw.plxphys, card->hw.plxsize);
3639err_release_io:
3640 release_region(card->hw.iophys, card->hw.iosize);
3641 kfree(card);
3642err_disable_dev:
3643 pci_disable_device(pdev);
3644 return err;
3645}
3646
3647static void __devexit cpc_remove_one(struct pci_dev *pdev)
3648{
3649 pc300_t *card = pci_get_drvdata(pdev);
3650
3651 if (card->hw.rambase) {
3652 int i;
3653
3654
3655 cpc_writew(card->hw.plxbase + card->hw.intctl_reg,
3656 cpc_readw(card->hw.plxbase + card->hw.intctl_reg) & ~(0x0040));
3657
3658 for (i = 0; i < card->hw.nchan; i++) {
3659 unregister_hdlc_device(card->chan[i].d.dev);
3660 }
3661 iounmap(card->hw.plxbase);
3662 iounmap(card->hw.scabase);
3663 iounmap(card->hw.rambase);
3664 release_mem_region(card->hw.plxphys, card->hw.plxsize);
3665 release_mem_region(card->hw.ramphys, card->hw.alloc_ramsize);
3666 release_mem_region(card->hw.scaphys, card->hw.scasize);
3667 release_region(card->hw.iophys, card->hw.iosize);
3668 if (card->hw.type == PC300_TE) {
3669 iounmap(card->hw.falcbase);
3670 release_mem_region(card->hw.falcphys, card->hw.falcsize);
3671 }
3672 for (i = 0; i < card->hw.nchan; i++)
3673 if (card->chan[i].d.dev)
3674 free_netdev(card->chan[i].d.dev);
3675 if (card->hw.irq)
3676 free_irq(card->hw.irq, card);
3677 kfree(card);
3678 pci_disable_device(pdev);
3679 }
3680}
3681
3682static struct pci_driver cpc_driver = {
3683 .name = "pc300",
3684 .id_table = cpc_pci_dev_id,
3685 .probe = cpc_init_one,
3686 .remove = __devexit_p(cpc_remove_one),
3687};
3688
3689static int __init cpc_init(void)
3690{
3691 return pci_register_driver(&cpc_driver);
3692}
3693
3694static void __exit cpc_cleanup_module(void)
3695{
3696 pci_unregister_driver(&cpc_driver);
3697}
3698
3699module_init(cpc_init);
3700module_exit(cpc_cleanup_module);
3701
3702MODULE_DESCRIPTION("Cyclades-PC300 cards driver");
3703MODULE_AUTHOR( "Author: Ivan Passos <ivan@cyclades.com>\r\n"
3704 "Maintainer: PC300 Maintainer <pc300@cyclades.com");
3705MODULE_LICENSE("GPL");
3706
3707