1
2.psize 0
3
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#include <linux/hdlc.h>
36#include <linux/hdlc/ioctl.h>
37#include "wanxl.h"
38
39
40
41MAX_RAM_SIZE = 16 * 1024 * 1024
42
43PCI9060_VECTOR = 0x0000006C
44CPM_IRQ_BASE = 0x40
45ERROR_VECTOR = CPM_IRQ_BASE * 4
46SCC1_VECTOR = (CPM_IRQ_BASE + 0x1E) * 4
47SCC2_VECTOR = (CPM_IRQ_BASE + 0x1D) * 4
48SCC3_VECTOR = (CPM_IRQ_BASE + 0x1C) * 4
49SCC4_VECTOR = (CPM_IRQ_BASE + 0x1B) * 4
50CPM_IRQ_LEVEL = 4
51TIMER_IRQ = 128
52TIMER_IRQ_LEVEL = 4
53PITR_CONST = 0x100 + 16
54
55MBAR = 0x0003FF00
56
57VALUE_WINDOW = 0x40000000
58ORDER_WINDOW = 0xC0000000
59
60PLX = 0xFFF90000
61
62CSRA = 0xFFFB0000
63CSRB = 0xFFFB0002
64CSRC = 0xFFFB0004
65CSRD = 0xFFFB0006
66STATUS_CABLE_LL = 0x2000
67STATUS_CABLE_DTR = 0x1000
68
69DPRBASE = 0xFFFC0000
70
71SCC1_BASE = DPRBASE + 0xC00
72MISC_BASE = DPRBASE + 0xCB0
73SCC2_BASE = DPRBASE + 0xD00
74SCC3_BASE = DPRBASE + 0xE00
75SCC4_BASE = DPRBASE + 0xF00
76
77
78
79SCC_RBASE = 0
80SCC_TBASE = 2
81SCC_RFCR = 4
82SCC_TFCR = 5
83SCC_MRBLR = 6
84SCC_C_MASK = 0x34
85SCC_C_PRES = 0x38
86SCC_MFLR = 0x46
87
88REGBASE = DPRBASE + 0x1000
89PICR = REGBASE + 0x026
90PITR = REGBASE + 0x02A
91OR1 = REGBASE + 0x064
92CICR = REGBASE + 0x540
93CIMR = REGBASE + 0x548
94CISR = REGBASE + 0x54C
95PADIR = REGBASE + 0x550
96PAPAR = REGBASE + 0x552
97PAODR = REGBASE + 0x554
98PADAT = REGBASE + 0x556
99
100PCDIR = REGBASE + 0x560
101PCPAR = REGBASE + 0x562
102PCSO = REGBASE + 0x564
103PCDAT = REGBASE + 0x566
104PCINT = REGBASE + 0x568
105CR = REGBASE + 0x5C0
106
107SCC1_REGS = REGBASE + 0x600
108SCC2_REGS = REGBASE + 0x620
109SCC3_REGS = REGBASE + 0x640
110SCC4_REGS = REGBASE + 0x660
111SICR = REGBASE + 0x6EC
112
113
114SCC_GSMR_L = 0x00
115SCC_GSMR_H = 0x04
116SCC_PSMR = 0x08
117SCC_TODR = 0x0C
118SCC_DSR = 0x0E
119SCC_SCCE = 0x10
120SCC_SCCM = 0x14
121SCC_SCCS = 0x17
122
123
124 .macro memcpy_from_pci src, dest, len
125 addl
126 andl
127 movel \src, PLX_DMA_0_PCI
128 movel \dest, PLX_DMA_0_LOCAL
129 movel \len, PLX_DMA_0_LENGTH
130 movel
131 bsr memcpy_from_pci_run
132 .endm
133
134 .macro memcpy_to_pci src, dest, len
135 addl
136 andl
137 movel \src, PLX_DMA_1_LOCAL
138 movel \dest, PLX_DMA_1_PCI
139 movel \len, PLX_DMA_1_LENGTH
140 movel
141 bsr memcpy_to_pci_run
142 .endm
143
144#else
145
146 .macro memcpy src, dest, len
147 movel %d7, -(%sp)
148 movel \len, %d7
149 lsrl
150 andl \len, \len
151 beq 99f
152 subl
15398: movel (\src)+, (\dest)+
154 dbfw \len, 98b
15599: movel %d7, \len
156 btstl
157 beq 99f
158 movew (\src)+, (\dest)+
15999: btstl
160 beq 99f
161 moveb (\src)+, (\dest)+
16299:
163 movel (%sp)+, %d7
164 .endm
165
166 .macro memcpy_from_pci src, dest, len
167 addl
168 memcpy \src, \dest, \len
169 .endm
170
171 .macro memcpy_to_pci src, dest, len
172 addl
173 memcpy \src, \dest, \len
174 .endm
175#endif
176
177
178 .macro wait_for_command
17999: btstl
180 bne 99b
181 .endm
182
183
184
185
186
187 .text
188 .global _start
189_start: bra init
190
191 .org _start + 4
192ch_status_addr: .long 0, 0, 0, 0
193rx_descs_addr: .long 0
194
195init:
196
197 movel OR1, %d0
198 andl
199 orl
200 movel %d0, OR1
201#endif
202
203 addl
204 clrl %d0
205init_1: tstl ch_status_addr(%d0)
206 beq init_2
207 addl
208init_2: addl
209 cmpl
210 bne init_1
211
212 movel
213 movel
214 movel
215 movel
216 movel
217 movel
218 movel
219
220 movel
221 movew
222 movew
223
224
225 movel
226 movel
227 movel
228 movel
229 movel
230 movel
231
232 orl
233
234
235 bsr ram_test
236#else
237 movel
238#endif
239 bsr check_csr
240
241 movew
242 clrw PADIR
243 clrw PCSO
244
245
246
247
248main: movel channel_stats, %d7
249 clrl channel_stats
250
251 tstl %d7
252 bne main_1
253
254 stop
255 movew
256 bra main
257
258main_1: clrl %d0
259 clrl %d6
260
261main_l: btstl
262 beq main_op
263 bclrl
264 bsr close_port
265main_op:
266 btstl
267 beq main_cl
268 bsr open_port
269main_cl:
270 btstl
271 beq main_txend
272 bsr tx
273main_txend:
274 btstl
275 beq main_next
276 bsr tx_end
277 bsr rx
278
279main_next:
280 lsrl
281 addl
282 cmpl
283 bne main_l
284 movel %d6, PLX_DOORBELL_FROM_CARD
285 bra main
286
287
288
289
290open_port:
291 movel ch_status_addr(%d0), %a0
292 tstl STATUS_OPEN(%a0)
293 bne open_port_ret
294 movel
295
296 clrl tx_in(%d0)
297 clrl tx_out(%d0)
298 clrl tx_count(%d0)
299 clrl rx_in(%d0)
300
301 movel SICR, %d1
302 andl clocking_mask(%d0), %d1
303 cmpl
304 bne open_port_clock_ext
305 orl clocking_txfromrx(%d0), %d1
306 bra open_port_set_clock
307
308open_port_clock_ext:
309 orl clocking_ext(%d0), %d1
310open_port_set_clock:
311 movel %d1, SICR
312
313 orw
314 bsr check_csr
315
316
317 movel first_buffer(%d0), %d1
318 movel tx_first_bd(%d0), %a1
319 movel
320 movel
321 cmpl
322 beq open_port_tx_loop
323 bsetl
324open_port_tx_loop:
325 movel %d3, (%a1)+
326 movel %d1, (%a1)+
327 addl
328 dbfw %d2, open_port_tx_loop
329
330 bsetl
331 movel %d3, (%a1)+
332 movel %d1, (%a1)+
333
334
335 movel
336open_port_rx_loop:
337 movel
338 movel %d1, (%a1)+
339 addl
340 dbfw %d2, open_port_rx_loop
341
342 movel
343 movel %d1, (%a1)+
344
345
346 movel scc_base_addr(%d0), %a1
347 movel scc_reg_addr(%d0), %a2
348
349 movel
350 movel
351
352 movel tx_first_bd(%d0), %d1
353 movew %d1, SCC_TBASE(%a1)
354 addl
355 movew %d1, SCC_RBASE(%a1)
356 moveb
357 moveb
358
359
360 cmpl
361 bne open_port_parity_1
362 clrw SCC_PSMR(%a2)
363 movel
364 movel
365 movew
366 movew
367 bra open_port_2
368
369open_port_parity_1:
370 cmpl
371 bne open_port_parity_2
372 movew
373 movel
374 movel
375 movew
376 movew
377 bra open_port_2
378
379open_port_parity_2:
380 cmpl
381 bne open_port_parity_3
382 clrw SCC_PSMR(%a2)
383 movel
384 clrl SCC_C_PRES(%a1)
385 movew
386 movew
387 bra open_port_2
388
389open_port_parity_3:
390 cmpl
391 bne open_port_parity_4
392 movew
393 movel
394 clrl SCC_C_PRES(%a1)
395 movew
396 movew
397 bra open_port_2
398
399open_port_parity_4:
400 clrw SCC_PSMR(%a2)
401 movel
402 movel
403 movew
404 clrw parity_bytes(%d0)
405
406open_port_2:
407 movel
408 cmpl
409 bne open_port_nrz
410 movel
411 bra open_port_3
412
413open_port_nrz:
414 movel
415open_port_3:
416 movew
417 movel %d0, %d1
418 lsll
419 orl
420 movew %d1, CR
421 wait_for_command
422
423
424 movew
425 orl
426open_port_ret:
427 rts
428
429
430
431
432close_port:
433 movel scc_reg_addr(%d0), %a0
434 clrw SCC_SCCM(%a0)
435 andl
436
437 andw
438 bsr check_csr
439
440 movel ch_status_addr(%d0), %d1
441 clrl STATUS_OPEN(%d1)
442 rts
443
444
445
446
447tx:
448 cmpl
449 beq tx_ret
450
451 movel tx_out(%d0), %d1
452 movel %d1, %d2
453 mulul
454 addl ch_status_addr(%d0), %d2
455 addl
456 cmpl
457 bne tx_ret
458
459
460 movel 4(%d2), %a0
461 lsll
462 addl tx_first_bd(%d0), %d1
463
464 movel 4(%d1), %a1
465 movel 8(%d2), %d2
466 movew %d2, 2(%d1)
467 memcpy_from_pci %a0, %a1, %d2
468 bsetl
469
470
471 movel tx_out(%d0), %d1
472 addl
473 cmpl
474 bne tx_1
475 clrl %d1
476tx_1: movel %d1, tx_out(%d0)
477
478 addl
479 bra tx
480
481tx_ret: rts
482
483
484
485
486
487rx: movel rx_in(%d0), %d1
488 lsll
489 addl rx_first_bd(%d0), %d1
490 movew (%d1), %d2
491 btstl
492 bne rx_ret
493
494 btstl
495 bne rx_overrun
496
497 tstw parity_bytes(%d0)
498 bne rx_parity
499 bclrl
500rx_parity:
501 andw
502 cmpw
503 bne rx_bad_frame
504 clrl %d3
505 movew 2(%d1), %d3
506 subw parity_bytes(%d0), %d3
507 cmpw
508 bgt rx_bad_frame
509
510rx_good_frame:
511 movel rx_out, %d2
512 mulul
513 addl rx_descs_addr, %d2
514 cmpl
515 bne rx_overrun
516
517 movel %d3, 8(%d2)
518 movel 4(%d1), %a0
519 movel 4(%d2), %a1
520 tstl %a1
521 beq rx_ignore_data
522 memcpy_to_pci %a0, %a1, %d3
523rx_ignore_data:
524 movel packet_full(%d0), (%d2)
525
526
527 bsetl
528 movel rx_out, %d2
529 addl
530 cmpl
531 bne rx_1
532 clrl %d2
533rx_1: movel %d2, rx_out
534
535rx_free_bd:
536 andw
537 bsetl
538
539 movel rx_in(%d0), %d1
540 addl
541 cmpl
542 bne rx_2
543 clrl %d1
544rx_2: movel %d1, rx_in(%d0)
545 bra rx
546
547rx_overrun:
548 movel ch_status_addr(%d0), %d2
549 addl
550 bra rx_free_bd
551
552rx_bad_frame:
553 movel ch_status_addr(%d0), %d2
554 addl
555 bra rx_free_bd
556
557rx_ret: rts
558
559
560
561
562
563tx_end: tstl tx_count(%d0)
564 beq tx_end_ret
565
566 movel tx_in(%d0), %d1
567 movel %d1, %d2
568 lsll
569 addl tx_first_bd(%d0), %d1
570 movew (%d1), %d3
571 btstl
572 bne tx_end_ret
573
574
575 orl bell_tx(%d0), %d6
576 subl
577 movel tx_in(%d0), %d1
578 addl
579 cmpl
580 bne tx_end_1
581 clrl %d1
582tx_end_1:
583 movel %d1, tx_in(%d0)
584
585
586 mulul
587 addl ch_status_addr(%d0), %d2
588 addl
589 btstl
590 bne tx_end_underrun
591 movel
592 bra tx_end
593
594tx_end_underrun:
595 movel
596 bra tx_end
597
598tx_end_ret: rts
599
600
601
602
603
604
605memcpy_from_pci_run:
606 movel %d0, -(%sp)
607 movew %sr, -(%sp)
608memcpy_1:
609 movel PLX_DMA_CMD_STS, %d0
610 btstl
611 bne memcpy_end
612 stop
613 movew
614 bra memcpy_1
615
616memcpy_to_pci_run:
617 movel %d0, -(%sp)
618 movew %sr, -(%sp)
619memcpy_2:
620 movel PLX_DMA_CMD_STS, %d0
621 btstl
622 bne memcpy_end
623 stop
624 movew
625 bra memcpy_2
626
627memcpy_end:
628 movew (%sp)+, %sr
629 movel (%sp)+, %d0
630 rts
631#endif
632
633
634
635
636
637
638
639
640pci9060_interrupt:
641 movel %d0, -(%sp)
642
643 movel PLX_DOORBELL_TO_CARD, %d0
644 movel %d0, PLX_DOORBELL_TO_CARD
645 orl %d0, channel_stats
646
647 movel
648
649 movel (%sp)+, %d0
650 rte
651
652
653
654port_interrupt_1:
655 orl
656 orl
657 movel
658 rte
659
660port_interrupt_2:
661 orl
662 orl
663 movel
664 rte
665
666port_interrupt_3:
667 orl
668 orl
669 movel
670 rte
671
672port_interrupt_4:
673 orl
674 orl
675 movel
676 rte
677
678error_interrupt:
679 rte
680
681
682
683
684check_csr:
685 movel %d0, -(%sp)
686 movel %d1, -(%sp)
687 movel %d2, -(%sp)
688 movel %a0, -(%sp)
689 movel %a1, -(%sp)
690
691 clrl %d0
692 movel
693
694check_csr_loop:
695 movew (%a0), %d1
696 andl
697 cmpw
698 bne check_csr_1
699 movew
700 bra check_csr_valid
701
702check_csr_1:
703 cmpw
704 bne check_csr_2
705 movew
706 bra check_csr_valid
707
708check_csr_2:
709 cmpw
710 bne check_csr_3
711 movew
712 bra check_csr_valid
713
714check_csr_3:
715 cmpw
716 bne check_csr_disable
717 movew
718 bra check_csr_valid
719
720check_csr_disable:
721 movew
722 movew
723 bra check_csr_write
724
725check_csr_valid:
726 movew csr_output(%d0), %d2
727 andw
728 orw %d2, %d1
729 movew
730
731check_csr_write:
732 cmpw old_csr_output(%d0), %d1
733 beq check_csr_input
734 movew %d1, old_csr_output(%d0)
735 movew %d1, (%a0)
736
737check_csr_input:
738 movew (PCDAT), %d1
739 andw dcd_mask(%d0), %d1
740 beq check_csr_dcd_on
741 movew (%a0), %d1
742 andw
743 bra check_csr_previous
744
745check_csr_dcd_on:
746 movew (%a0), %d1
747 orw
748check_csr_previous:
749 andw %d2, %d1
750 movel ch_status_addr(%d0), %a1
751 cmpl STATUS_CABLE(%a1), %d1
752 beq check_csr_next
753 movel %d1, STATUS_CABLE(%a1)
754 movel bell_cable(%d0), PLX_DOORBELL_FROM_CARD
755
756check_csr_next:
757 addl
758 addl
759 cmpl
760 bne check_csr_loop
761
762 movel (%sp)+, %a1
763 movel (%sp)+, %a0
764 movel (%sp)+, %d2
765 movel (%sp)+, %d1
766 movel (%sp)+, %d0
767 rts
768
769
770
771
772timer_interrupt:
773 bsr check_csr
774 rte
775
776
777
778
779ram_test:
780 movel
781 movel %d1, (128 * 1024 - 4)
782 movel
783ram_test_size:
784 cmpl
785 beq ram_test_size_found
786 movel %d0, %a0
787 addl
788 cmpl (%a0), %d1
789 beq ram_test_size_check
790ram_test_next_size:
791 lsll
792 bra ram_test_size
793
794ram_test_size_check:
795 eorl
796 movel %d1, (128 * 1024 - 4)
797 cmpl (%a0), %d1
798 bne ram_test_next_size
799
800ram_test_size_found:
801 movel %d0, %a0
802 subl
803 lsrl
804 movel %d0, %d1
805ram_test_fill:
806 movel %a0, -(%a0)
807 dbfw %d1, ram_test_fill
808 subl
809 cmpl
810 bne ram_test_fill
811
812ram_test_loop:
813 cmpl (%a0)+, %a0
814 dbnew %d0, ram_test_loop
815 bne ram_test_found_bad
816 subl
817 cmpl
818 bne ram_test_loop
819 bra ram_test_all_ok
820
821ram_test_found_bad:
822 subl
823ram_test_all_ok:
824 movel %a0, PLX_MAILBOX_5
825 rts
826#endif
827
828
829
830
831scc_reg_addr:
832 .long SCC1_REGS, SCC2_REGS, SCC3_REGS, SCC4_REGS
833scc_base_addr:
834 .long SCC1_BASE, SCC2_BASE, SCC3_BASE, SCC4_BASE
835
836tx_first_bd:
837 .long DPRBASE
838 .long DPRBASE + (TX_BUFFERS + RX_BUFFERS) * 8
839 .long DPRBASE + (TX_BUFFERS + RX_BUFFERS) * 8 * 2
840 .long DPRBASE + (TX_BUFFERS + RX_BUFFERS) * 8 * 3
841
842rx_first_bd:
843 .long DPRBASE + TX_BUFFERS * 8
844 .long DPRBASE + TX_BUFFERS * 8 + (TX_BUFFERS + RX_BUFFERS) * 8
845 .long DPRBASE + TX_BUFFERS * 8 + (TX_BUFFERS + RX_BUFFERS) * 8 * 2
846 .long DPRBASE + TX_BUFFERS * 8 + (TX_BUFFERS + RX_BUFFERS) * 8 * 3
847
848first_buffer:
849 .long BUFFERS_ADDR
850 .long BUFFERS_ADDR + (TX_BUFFERS + RX_BUFFERS) * BUFFER_LENGTH
851 .long BUFFERS_ADDR + (TX_BUFFERS + RX_BUFFERS) * BUFFER_LENGTH * 2
852 .long BUFFERS_ADDR + (TX_BUFFERS + RX_BUFFERS) * BUFFER_LENGTH * 3
853
854bell_tx:
855 .long 1 << DOORBELL_FROM_CARD_TX_0, 1 << DOORBELL_FROM_CARD_TX_1
856 .long 1 << DOORBELL_FROM_CARD_TX_2, 1 << DOORBELL_FROM_CARD_TX_3
857
858bell_cable:
859 .long 1 << DOORBELL_FROM_CARD_CABLE_0, 1 << DOORBELL_FROM_CARD_CABLE_1
860 .long 1 << DOORBELL_FROM_CARD_CABLE_2, 1 << DOORBELL_FROM_CARD_CABLE_3
861
862packet_full:
863 .long PACKET_FULL, PACKET_FULL + 1, PACKET_FULL + 2, PACKET_FULL + 3
864
865clocking_ext:
866 .long 0x0000002C, 0x00003E00, 0x002C0000, 0x3E000000
867clocking_txfromrx:
868 .long 0x0000002D, 0x00003F00, 0x002D0000, 0x3F000000
869clocking_mask:
870 .long 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000
871dcd_mask:
872 .word 0x020, 0, 0x080, 0, 0x200, 0, 0x800
873
874 .ascii "wanXL firmware\n"
875 .asciz "Copyright (C) 2003 Krzysztof Halasa <khc@pm.waw.pl>\n"
876
877
878
879
880 .align 4
881channel_stats: .long 0
882
883tx_in: .long 0, 0, 0, 0
884tx_out: .long 0, 0, 0, 0
885tx_count: .long 0, 0, 0, 0
886
887rx_in: .long 0, 0, 0, 0
888rx_out: .long 0
889parity_bytes: .word 0, 0, 0, 0, 0, 0, 0
890
891csr_output: .word 0
892old_csr_output: .word 0, 0, 0, 0, 0, 0, 0
893 .align 4
894firmware_end:
895