1
2
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#include <linux/module.h>
29#include <linux/kernel.h>
30#include <linux/mm.h>
31#include <linux/pci.h>
32#include <linux/errno.h>
33#include <linux/atm.h>
34#include <linux/atmdev.h>
35#include <linux/sonet.h>
36#include <linux/skbuff.h>
37#include <linux/time.h>
38#include <linux/delay.h>
39#include <linux/uio.h>
40#include <linux/init.h>
41#include <linux/interrupt.h>
42#include <linux/ioport.h>
43#include <linux/wait.h>
44#include <linux/slab.h>
45
46#include <asm/system.h>
47#include <asm/io.h>
48#include <linux/atomic.h>
49#include <asm/uaccess.h>
50#include <asm/string.h>
51#include <asm/byteorder.h>
52
53#include "horizon.h"
54
55#define maintainer_string "Giuliano Procida at Madge Networks <gprocida@madge.com>"
56#define description_string "Madge ATM Horizon [Ultra] driver"
57#define version_string "1.2.1"
58
59static inline void __init show_version (void) {
60 printk ("%s version %s\n", description_string, version_string);
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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360static void do_housekeeping (unsigned long arg);
361
362static unsigned short debug = 0;
363static unsigned short vpi_bits = 0;
364static int max_tx_size = 9000;
365static int max_rx_size = 9000;
366static unsigned char pci_lat = 0;
367
368
369
370
371static inline void wr_regl (const hrz_dev * dev, unsigned char reg, u32 data) {
372 outl (cpu_to_le32 (data), dev->iobase + reg);
373}
374
375static inline u32 rd_regl (const hrz_dev * dev, unsigned char reg) {
376 return le32_to_cpu (inl (dev->iobase + reg));
377}
378
379static inline void wr_regw (const hrz_dev * dev, unsigned char reg, u16 data) {
380 outw (cpu_to_le16 (data), dev->iobase + reg);
381}
382
383static inline u16 rd_regw (const hrz_dev * dev, unsigned char reg) {
384 return le16_to_cpu (inw (dev->iobase + reg));
385}
386
387static inline void wrs_regb (const hrz_dev * dev, unsigned char reg, void * addr, u32 len) {
388 outsb (dev->iobase + reg, addr, len);
389}
390
391static inline void rds_regb (const hrz_dev * dev, unsigned char reg, void * addr, u32 len) {
392 insb (dev->iobase + reg, addr, len);
393}
394
395
396
397
398static inline void wr_mem (const hrz_dev * dev, HDW * addr, u32 data) {
399
400 wr_regl (dev, MEM_WR_ADDR_REG_OFF, (addr - (HDW *) 0) * sizeof(HDW));
401 wr_regl (dev, MEMORY_PORT_OFF, data);
402}
403
404static inline u32 rd_mem (const hrz_dev * dev, HDW * addr) {
405
406 wr_regl (dev, MEM_RD_ADDR_REG_OFF, (addr - (HDW *) 0) * sizeof(HDW));
407 return rd_regl (dev, MEMORY_PORT_OFF);
408}
409
410static inline void wr_framer (const hrz_dev * dev, u32 addr, u32 data) {
411 wr_regl (dev, MEM_WR_ADDR_REG_OFF, (u32) addr | 0x80000000);
412 wr_regl (dev, MEMORY_PORT_OFF, data);
413}
414
415static inline u32 rd_framer (const hrz_dev * dev, u32 addr) {
416 wr_regl (dev, MEM_RD_ADDR_REG_OFF, (u32) addr | 0x80000000);
417 return rd_regl (dev, MEMORY_PORT_OFF);
418}
419
420
421
422
423
424static inline void FLUSH_RX_CHANNEL (hrz_dev * dev, u16 channel) {
425 wr_regw (dev, RX_CHANNEL_PORT_OFF, FLUSH_CHANNEL | channel);
426 return;
427}
428
429static void WAIT_FLUSH_RX_COMPLETE (hrz_dev * dev) {
430 while (rd_regw (dev, RX_CHANNEL_PORT_OFF) & FLUSH_CHANNEL)
431 ;
432 return;
433}
434
435static inline void SELECT_RX_CHANNEL (hrz_dev * dev, u16 channel) {
436 wr_regw (dev, RX_CHANNEL_PORT_OFF, channel);
437 return;
438}
439
440static void WAIT_UPDATE_COMPLETE (hrz_dev * dev) {
441 while (rd_regw (dev, RX_CHANNEL_PORT_OFF) & RX_CHANNEL_UPDATE_IN_PROGRESS)
442 ;
443 return;
444}
445
446
447
448static inline void SELECT_TX_CHANNEL (hrz_dev * dev, u16 tx_channel) {
449 wr_regl (dev, TX_CHANNEL_PORT_OFF, tx_channel);
450 return;
451}
452
453
454
455static inline void update_tx_channel_config (hrz_dev * dev, short chan, u8 mode, u16 value) {
456 wr_regw (dev, TX_CHANNEL_CONFIG_COMMAND_OFF,
457 chan * TX_CHANNEL_CONFIG_MULT | mode);
458 wr_regw (dev, TX_CHANNEL_CONFIG_DATA_OFF, value);
459 return;
460}
461
462static inline u16 query_tx_channel_config (hrz_dev * dev, short chan, u8 mode) {
463 wr_regw (dev, TX_CHANNEL_CONFIG_COMMAND_OFF,
464 chan * TX_CHANNEL_CONFIG_MULT | mode);
465 return rd_regw (dev, TX_CHANNEL_CONFIG_DATA_OFF);
466}
467
468
469
470static inline void dump_skb (char * prefix, unsigned int vc, struct sk_buff * skb) {
471#ifdef DEBUG_HORIZON
472 unsigned int i;
473 unsigned char * data = skb->data;
474 PRINTDB (DBG_DATA, "%s(%u) ", prefix, vc);
475 for (i=0; i<skb->len && i < 256;i++)
476 PRINTDM (DBG_DATA, "%02x ", data[i]);
477 PRINTDE (DBG_DATA,"");
478#else
479 (void) prefix;
480 (void) vc;
481 (void) skb;
482#endif
483 return;
484}
485
486static inline void dump_regs (hrz_dev * dev) {
487#ifdef DEBUG_HORIZON
488 PRINTD (DBG_REGS, "CONTROL 0: %#x", rd_regl (dev, CONTROL_0_REG));
489 PRINTD (DBG_REGS, "RX CONFIG: %#x", rd_regw (dev, RX_CONFIG_OFF));
490 PRINTD (DBG_REGS, "TX CONFIG: %#x", rd_regw (dev, TX_CONFIG_OFF));
491 PRINTD (DBG_REGS, "TX STATUS: %#x", rd_regw (dev, TX_STATUS_OFF));
492 PRINTD (DBG_REGS, "IRQ ENBLE: %#x", rd_regl (dev, INT_ENABLE_REG_OFF));
493 PRINTD (DBG_REGS, "IRQ SORCE: %#x", rd_regl (dev, INT_SOURCE_REG_OFF));
494#else
495 (void) dev;
496#endif
497 return;
498}
499
500static inline void dump_framer (hrz_dev * dev) {
501#ifdef DEBUG_HORIZON
502 unsigned int i;
503 PRINTDB (DBG_REGS, "framer registers:");
504 for (i = 0; i < 0x10; ++i)
505 PRINTDM (DBG_REGS, " %02x", rd_framer (dev, i));
506 PRINTDE (DBG_REGS,"");
507#else
508 (void) dev;
509#endif
510 return;
511}
512
513
514
515
516
517static inline int channel_to_vpivci (const u16 channel, short * vpi, int * vci) {
518 unsigned short vci_bits = 10 - vpi_bits;
519 if ((channel & RX_CHANNEL_MASK) == channel) {
520 *vci = channel & ((~0)<<vci_bits);
521 *vpi = channel >> vci_bits;
522 return channel ? 0 : -EINVAL;
523 }
524 return -EINVAL;
525}
526
527static inline int vpivci_to_channel (u16 * channel, const short vpi, const int vci) {
528 unsigned short vci_bits = 10 - vpi_bits;
529 if (0 <= vpi && vpi < 1<<vpi_bits && 0 <= vci && vci < 1<<vci_bits) {
530 *channel = vpi<<vci_bits | vci;
531 return *channel ? 0 : -EINVAL;
532 }
533 return -EINVAL;
534}
535
536
537
538static inline u16 rx_q_entry_to_length (u32 x) {
539 return x & RX_Q_ENTRY_LENGTH_MASK;
540}
541
542static inline u16 rx_q_entry_to_rx_channel (u32 x) {
543 return (x>>RX_Q_ENTRY_CHANNEL_SHIFT) & RX_CHANNEL_MASK;
544}
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592#define BR_UKN 1031250l
593#define BR_HRZ 4000000l
594#define BR_ULT 5000000l
595
596
597#define CR_MIND 0
598#define CR_MAXD 14
599
600
601#define CR_MAXPEXP 4
602
603static int make_rate (const hrz_dev * dev, u32 c, rounding r,
604 u16 * bits, unsigned int * actual)
605{
606
607 const unsigned long br = test_bit(ultra, &dev->flags) ? BR_ULT : BR_HRZ;
608
609 u32 div = CR_MIND;
610 u32 pre;
611
612
613
614
615
616 unsigned long br_man = br;
617 unsigned int br_exp = 0;
618
619 PRINTD (DBG_QOS|DBG_FLOW, "make_rate b=%lu, c=%u, %s", br, c,
620 r == round_up ? "up" : r == round_down ? "down" : "nearest");
621
622
623 if (!c) {
624 PRINTD (DBG_QOS|DBG_ERR, "zero rate is not allowed!");
625 return -EINVAL;
626 }
627
628 while (br_exp < CR_MAXPEXP + CR_MIND && (br_man % 2 == 0)) {
629 br_man = br_man >> 1;
630 ++br_exp;
631 }
632
633
634
635 if (br_man <= (c << (CR_MAXPEXP+CR_MIND-br_exp))) {
636
637
638 switch (r) {
639 case round_down:
640 pre = DIV_ROUND_UP(br, c<<div);
641
642 if (!pre)
643 pre = 1;
644 break;
645 case round_nearest:
646 pre = DIV_ROUND_CLOSEST(br, c<<div);
647
648 if (!pre)
649 pre = 1;
650 break;
651 default:
652 pre = br/(c<<div);
653
654 if (!pre)
655 return -EINVAL;
656 }
657 PRINTD (DBG_QOS, "A: p=%u, d=%u", pre, div);
658 goto got_it;
659 }
660
661
662
663 while (div < CR_MAXD) {
664 div++;
665 if (br_man <= (c << (CR_MAXPEXP+div-br_exp))) {
666
667
668
669
670
671 switch (r) {
672 case round_down:
673 pre = DIV_ROUND_UP(br, c<<div);
674 break;
675 case round_nearest:
676 pre = DIV_ROUND_CLOSEST(br, c<<div);
677 break;
678 default:
679 pre = br/(c<<div);
680 }
681 PRINTD (DBG_QOS, "B: p=%u, d=%u", pre, div);
682 goto got_it;
683 }
684 }
685
686
687
688
689 if (r == round_down)
690 return -EINVAL;
691 pre = 1 << CR_MAXPEXP;
692 PRINTD (DBG_QOS, "C: p=%u, d=%u", pre, div);
693got_it:
694
695 if (div > CR_MAXD || (!pre) || pre > 1<<CR_MAXPEXP) {
696 PRINTD (DBG_QOS, "set_cr internal failure: d=%u p=%u",
697 div, pre);
698 return -EINVAL;
699 } else {
700 if (bits)
701 *bits = (div<<CLOCK_SELECT_SHIFT) | (pre-1);
702 if (actual) {
703 *actual = DIV_ROUND_UP(br, pre<<div);
704 PRINTD (DBG_QOS, "actual rate: %u", *actual);
705 }
706 return 0;
707 }
708}
709
710static int make_rate_with_tolerance (const hrz_dev * dev, u32 c, rounding r, unsigned int tol,
711 u16 * bit_pattern, unsigned int * actual) {
712 unsigned int my_actual;
713
714 PRINTD (DBG_QOS|DBG_FLOW, "make_rate_with_tolerance c=%u, %s, tol=%u",
715 c, (r == round_up) ? "up" : (r == round_down) ? "down" : "nearest", tol);
716
717 if (!actual)
718
719 actual = &my_actual;
720
721 if (make_rate (dev, c, round_nearest, bit_pattern, actual))
722
723 return -1;
724
725 if (c - tol <= *actual && *actual <= c + tol)
726
727 return 0;
728 else
729
730 return make_rate (dev, c, r, bit_pattern, actual);
731}
732
733
734
735static int hrz_open_rx (hrz_dev * dev, u16 channel) {
736
737
738
739 unsigned long flags;
740 u32 channel_type;
741
742 u16 buf_ptr = RX_CHANNEL_IDLE;
743
744 rx_ch_desc * rx_desc = &memmap->rx_descs[channel];
745
746 PRINTD (DBG_FLOW, "hrz_open_rx %x", channel);
747
748 spin_lock_irqsave (&dev->mem_lock, flags);
749 channel_type = rd_mem (dev, &rx_desc->wr_buf_type) & BUFFER_PTR_MASK;
750 spin_unlock_irqrestore (&dev->mem_lock, flags);
751
752
753 if (channel_type != RX_CHANNEL_DISABLED) {
754 PRINTD (DBG_ERR|DBG_VCC, "RX channel for VC already open");
755 return -EBUSY;
756 }
757
758
759 if (dev->noof_spare_buffers) {
760 buf_ptr = dev->spare_buffers[--dev->noof_spare_buffers];
761 PRINTD (DBG_VCC, "using a spare buffer: %u", buf_ptr);
762
763 if (buf_ptr == RX_CHANNEL_DISABLED || buf_ptr == RX_CHANNEL_IDLE) {
764
765 PRINTD (DBG_ERR|DBG_VCC, "bad spare buffer pointer, using IDLE");
766 buf_ptr = RX_CHANNEL_IDLE;
767 }
768 } else {
769 PRINTD (DBG_VCC, "using IDLE buffer pointer");
770 }
771
772
773
774
775 spin_lock_irqsave (&dev->mem_lock, flags);
776
777 wr_mem (dev, &rx_desc->wr_buf_type,
778 buf_ptr | CHANNEL_TYPE_AAL5 | FIRST_CELL_OF_AAL5_FRAME);
779 if (buf_ptr != RX_CHANNEL_IDLE)
780 wr_mem (dev, &rx_desc->rd_buf_type, buf_ptr);
781
782 spin_unlock_irqrestore (&dev->mem_lock, flags);
783
784
785
786 PRINTD (DBG_FLOW, "hrz_open_rx ok");
787
788 return 0;
789}
790
791#if 0
792
793
794static void hrz_change_vc_qos (ATM_RXER * rxer, MAAL_QOS * qos) {
795 rxer->rate = make_rate (qos->peak_cells);
796}
797#endif
798
799
800
801static void hrz_kfree_skb (struct sk_buff * skb) {
802 if (ATM_SKB(skb)->vcc->pop) {
803 ATM_SKB(skb)->vcc->pop (ATM_SKB(skb)->vcc, skb);
804 } else {
805 dev_kfree_skb_any (skb);
806 }
807}
808
809
810
811static void hrz_close_rx (hrz_dev * dev, u16 vc) {
812 unsigned long flags;
813
814 u32 value;
815
816 u32 r1, r2;
817
818 rx_ch_desc * rx_desc = &memmap->rx_descs[vc];
819
820 int was_idle = 0;
821
822 spin_lock_irqsave (&dev->mem_lock, flags);
823 value = rd_mem (dev, &rx_desc->wr_buf_type) & BUFFER_PTR_MASK;
824 spin_unlock_irqrestore (&dev->mem_lock, flags);
825
826 if (value == RX_CHANNEL_DISABLED) {
827
828 PRINTD (DBG_VCC, "closing VC: RX channel %u already disabled", vc);
829 return;
830 }
831 if (value == RX_CHANNEL_IDLE)
832 was_idle = 1;
833
834 spin_lock_irqsave (&dev->mem_lock, flags);
835
836 for (;;) {
837 wr_mem (dev, &rx_desc->wr_buf_type, RX_CHANNEL_DISABLED);
838
839 if ((rd_mem (dev, &rx_desc->wr_buf_type) & BUFFER_PTR_MASK) == RX_CHANNEL_DISABLED)
840 break;
841
842 was_idle = 0;
843 }
844
845 if (was_idle) {
846 spin_unlock_irqrestore (&dev->mem_lock, flags);
847 return;
848 }
849
850 WAIT_FLUSH_RX_COMPLETE(dev);
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873 for (;;) {
874
875
876
877
878 u16 other = vc^(RX_CHANS/2);
879
880 SELECT_RX_CHANNEL (dev, other);
881 WAIT_UPDATE_COMPLETE (dev);
882
883 r1 = rd_mem (dev, &rx_desc->rd_buf_type);
884
885
886
887
888 SELECT_RX_CHANNEL (dev, vc);
889 WAIT_UPDATE_COMPLETE (dev);
890
891
892
893 FLUSH_RX_CHANNEL (dev, vc);
894 WAIT_FLUSH_RX_COMPLETE (dev);
895
896
897
898 SELECT_RX_CHANNEL (dev, other);
899 WAIT_UPDATE_COMPLETE (dev);
900
901 r2 = rd_mem (dev, &rx_desc->rd_buf_type);
902
903 PRINTD (DBG_VCC|DBG_RX, "r1 = %u, r2 = %u", r1, r2);
904
905 if (r1 == r2) {
906 dev->spare_buffers[dev->noof_spare_buffers++] = (u16)r1;
907 break;
908 }
909 }
910
911#if 0
912 {
913 rx_q_entry * wr_ptr = &memmap->rx_q_entries[rd_regw (dev, RX_QUEUE_WR_PTR_OFF)];
914 rx_q_entry * rd_ptr = dev->rx_q_entry;
915
916 PRINTD (DBG_VCC|DBG_RX, "rd_ptr = %u, wr_ptr = %u", rd_ptr, wr_ptr);
917
918 while (rd_ptr != wr_ptr) {
919 u32 x = rd_mem (dev, (HDW *) rd_ptr);
920
921 if (vc == rx_q_entry_to_rx_channel (x)) {
922 x |= SIMONS_DODGEY_MARKER;
923
924 PRINTD (DBG_RX|DBG_VCC|DBG_WARN, "marking a frame as dodgey");
925
926 wr_mem (dev, (HDW *) rd_ptr, x);
927 }
928
929 if (rd_ptr == dev->rx_q_wrap)
930 rd_ptr = dev->rx_q_reset;
931 else
932 rd_ptr++;
933 }
934 }
935#endif
936
937 spin_unlock_irqrestore (&dev->mem_lock, flags);
938
939 return;
940}
941
942
943
944
945
946
947
948
949
950static void rx_schedule (hrz_dev * dev, int irq) {
951 unsigned int rx_bytes;
952
953 int pio_instead = 0;
954#ifndef TAILRECURSIONWORKS
955 pio_instead = 1;
956 while (pio_instead) {
957#endif
958
959 rx_bytes = dev->rx_bytes;
960
961#if 0
962 spin_count = 0;
963 while (rd_regl (dev, MASTER_RX_COUNT_REG_OFF)) {
964 PRINTD (DBG_RX|DBG_WARN, "RX error: other PCI Bus Master RX still in progress!");
965 if (++spin_count > 10) {
966 PRINTD (DBG_RX|DBG_ERR, "spun out waiting PCI Bus Master RX completion");
967 wr_regl (dev, MASTER_RX_COUNT_REG_OFF, 0);
968 clear_bit (rx_busy, &dev->flags);
969 hrz_kfree_skb (dev->rx_skb);
970 return;
971 }
972 }
973#endif
974
975
976
977
978
979 if (rx_bytes) {
980
981 if (rx_bytes <= MAX_PIO_COUNT) {
982 PRINTD (DBG_RX|DBG_BUS, "(pio)");
983 pio_instead = 1;
984 }
985 if (rx_bytes <= MAX_TRANSFER_COUNT) {
986 PRINTD (DBG_RX|DBG_BUS, "(simple or last multi)");
987 dev->rx_bytes = 0;
988 } else {
989 PRINTD (DBG_RX|DBG_BUS, "(continuing multi)");
990 dev->rx_bytes = rx_bytes - MAX_TRANSFER_COUNT;
991 rx_bytes = MAX_TRANSFER_COUNT;
992 }
993 } else {
994
995
996#if 0
997 unsigned int rx_regions = dev->rx_regions;
998#else
999 unsigned int rx_regions = 0;
1000#endif
1001
1002 if (rx_regions) {
1003#if 0
1004
1005 dev->rx_addr = dev->rx_iovec->iov_base;
1006 rx_bytes = dev->rx_iovec->iov_len;
1007 ++dev->rx_iovec;
1008 dev->rx_regions = rx_regions - 1;
1009
1010 if (rx_bytes <= MAX_PIO_COUNT) {
1011 PRINTD (DBG_RX|DBG_BUS, "(pio)");
1012 pio_instead = 1;
1013 }
1014 if (rx_bytes <= MAX_TRANSFER_COUNT) {
1015 PRINTD (DBG_RX|DBG_BUS, "(full region)");
1016 dev->rx_bytes = 0;
1017 } else {
1018 PRINTD (DBG_RX|DBG_BUS, "(start multi region)");
1019 dev->rx_bytes = rx_bytes - MAX_TRANSFER_COUNT;
1020 rx_bytes = MAX_TRANSFER_COUNT;
1021 }
1022#endif
1023 } else {
1024
1025
1026 struct sk_buff * skb = dev->rx_skb;
1027
1028
1029 FLUSH_RX_CHANNEL (dev, dev->rx_channel);
1030
1031 dump_skb ("<<<", dev->rx_channel, skb);
1032
1033 PRINTD (DBG_RX|DBG_SKB, "push %p %u", skb->data, skb->len);
1034
1035 {
1036 struct atm_vcc * vcc = ATM_SKB(skb)->vcc;
1037
1038 atomic_inc(&vcc->stats->rx);
1039 __net_timestamp(skb);
1040
1041 vcc->push (vcc, skb);
1042 }
1043 }
1044 }
1045
1046
1047 if (rx_bytes) {
1048 if (pio_instead) {
1049 if (irq)
1050 wr_regl (dev, MASTER_RX_COUNT_REG_OFF, 0);
1051 rds_regb (dev, DATA_PORT_OFF, dev->rx_addr, rx_bytes);
1052 } else {
1053 wr_regl (dev, MASTER_RX_ADDR_REG_OFF, virt_to_bus (dev->rx_addr));
1054 wr_regl (dev, MASTER_RX_COUNT_REG_OFF, rx_bytes);
1055 }
1056 dev->rx_addr += rx_bytes;
1057 } else {
1058 if (irq)
1059 wr_regl (dev, MASTER_RX_COUNT_REG_OFF, 0);
1060
1061 YELLOW_LED_ON(dev);
1062 clear_bit (rx_busy, &dev->flags);
1063 PRINTD (DBG_RX, "cleared rx_busy for dev %p", dev);
1064 }
1065
1066#ifdef TAILRECURSIONWORKS
1067
1068 if (pio_instead)
1069 return rx_schedule (dev, 0);
1070 return;
1071#else
1072
1073 irq = 0;
1074 }
1075 return;
1076#endif
1077}
1078
1079
1080
1081static void rx_bus_master_complete_handler (hrz_dev * dev) {
1082 if (test_bit (rx_busy, &dev->flags)) {
1083 rx_schedule (dev, 1);
1084 } else {
1085 PRINTD (DBG_RX|DBG_ERR, "unexpected RX bus master completion");
1086
1087 wr_regl (dev, MASTER_RX_COUNT_REG_OFF, 0);
1088 }
1089 return;
1090}
1091
1092
1093
1094static int tx_hold (hrz_dev * dev) {
1095 PRINTD (DBG_TX, "sleeping at tx lock %p %lu", dev, dev->flags);
1096 wait_event_interruptible(dev->tx_queue, (!test_and_set_bit(tx_busy, &dev->flags)));
1097 PRINTD (DBG_TX, "woken at tx lock %p %lu", dev, dev->flags);
1098 if (signal_pending (current))
1099 return -1;
1100 PRINTD (DBG_TX, "set tx_busy for dev %p", dev);
1101 return 0;
1102}
1103
1104
1105
1106static inline void tx_release (hrz_dev * dev) {
1107 clear_bit (tx_busy, &dev->flags);
1108 PRINTD (DBG_TX, "cleared tx_busy for dev %p", dev);
1109 wake_up_interruptible (&dev->tx_queue);
1110}
1111
1112
1113
1114static void tx_schedule (hrz_dev * const dev, int irq) {
1115 unsigned int tx_bytes;
1116
1117 int append_desc = 0;
1118
1119 int pio_instead = 0;
1120#ifndef TAILRECURSIONWORKS
1121 pio_instead = 1;
1122 while (pio_instead) {
1123#endif
1124
1125 tx_bytes = dev->tx_bytes;
1126
1127#if 0
1128 spin_count = 0;
1129 while (rd_regl (dev, MASTER_TX_COUNT_REG_OFF)) {
1130 PRINTD (DBG_TX|DBG_WARN, "TX error: other PCI Bus Master TX still in progress!");
1131 if (++spin_count > 10) {
1132 PRINTD (DBG_TX|DBG_ERR, "spun out waiting PCI Bus Master TX completion");
1133 wr_regl (dev, MASTER_TX_COUNT_REG_OFF, 0);
1134 tx_release (dev);
1135 hrz_kfree_skb (dev->tx_skb);
1136 return;
1137 }
1138 }
1139#endif
1140
1141 if (tx_bytes) {
1142
1143 if (!test_bit (ultra, &dev->flags) || tx_bytes <= MAX_PIO_COUNT) {
1144 PRINTD (DBG_TX|DBG_BUS, "(pio)");
1145 pio_instead = 1;
1146 }
1147 if (tx_bytes <= MAX_TRANSFER_COUNT) {
1148 PRINTD (DBG_TX|DBG_BUS, "(simple or last multi)");
1149 if (!dev->tx_iovec) {
1150
1151 append_desc = 1;
1152 }
1153 dev->tx_bytes = 0;
1154 } else {
1155 PRINTD (DBG_TX|DBG_BUS, "(continuing multi)");
1156 dev->tx_bytes = tx_bytes - MAX_TRANSFER_COUNT;
1157 tx_bytes = MAX_TRANSFER_COUNT;
1158 }
1159 } else {
1160
1161
1162 unsigned int tx_regions = dev->tx_regions;
1163
1164 if (tx_regions) {
1165
1166 dev->tx_addr = dev->tx_iovec->iov_base;
1167 tx_bytes = dev->tx_iovec->iov_len;
1168 ++dev->tx_iovec;
1169 dev->tx_regions = tx_regions - 1;
1170
1171 if (!test_bit (ultra, &dev->flags) || tx_bytes <= MAX_PIO_COUNT) {
1172 PRINTD (DBG_TX|DBG_BUS, "(pio)");
1173 pio_instead = 1;
1174 }
1175 if (tx_bytes <= MAX_TRANSFER_COUNT) {
1176 PRINTD (DBG_TX|DBG_BUS, "(full region)");
1177 dev->tx_bytes = 0;
1178 } else {
1179 PRINTD (DBG_TX|DBG_BUS, "(start multi region)");
1180 dev->tx_bytes = tx_bytes - MAX_TRANSFER_COUNT;
1181 tx_bytes = MAX_TRANSFER_COUNT;
1182 }
1183 } else {
1184
1185
1186 struct sk_buff * skb = dev->tx_skb;
1187 dev->tx_iovec = NULL;
1188
1189
1190 atomic_inc(&ATM_SKB(skb)->vcc->stats->tx);
1191
1192
1193 hrz_kfree_skb (skb);
1194 }
1195 }
1196
1197
1198 if (tx_bytes) {
1199 if (pio_instead) {
1200 if (irq)
1201 wr_regl (dev, MASTER_TX_COUNT_REG_OFF, 0);
1202 wrs_regb (dev, DATA_PORT_OFF, dev->tx_addr, tx_bytes);
1203 if (append_desc)
1204 wr_regl (dev, TX_DESCRIPTOR_PORT_OFF, cpu_to_be32 (dev->tx_skb->len));
1205 } else {
1206 wr_regl (dev, MASTER_TX_ADDR_REG_OFF, virt_to_bus (dev->tx_addr));
1207 if (append_desc)
1208 wr_regl (dev, TX_DESCRIPTOR_REG_OFF, cpu_to_be32 (dev->tx_skb->len));
1209 wr_regl (dev, MASTER_TX_COUNT_REG_OFF,
1210 append_desc
1211 ? tx_bytes | MASTER_TX_AUTO_APPEND_DESC
1212 : tx_bytes);
1213 }
1214 dev->tx_addr += tx_bytes;
1215 } else {
1216 if (irq)
1217 wr_regl (dev, MASTER_TX_COUNT_REG_OFF, 0);
1218 YELLOW_LED_ON(dev);
1219 tx_release (dev);
1220 }
1221
1222#ifdef TAILRECURSIONWORKS
1223
1224 if (pio_instead)
1225 return tx_schedule (dev, 0);
1226 return;
1227#else
1228
1229 irq = 0;
1230 }
1231 return;
1232#endif
1233}
1234
1235
1236
1237static void tx_bus_master_complete_handler (hrz_dev * dev) {
1238 if (test_bit (tx_busy, &dev->flags)) {
1239 tx_schedule (dev, 1);
1240 } else {
1241 PRINTD (DBG_TX|DBG_ERR, "unexpected TX bus master completion");
1242
1243 wr_regl (dev, MASTER_TX_COUNT_REG_OFF, 0);
1244 }
1245 return;
1246}
1247
1248
1249
1250
1251static u32 rx_queue_entry_next (hrz_dev * dev) {
1252 u32 rx_queue_entry;
1253 spin_lock (&dev->mem_lock);
1254 rx_queue_entry = rd_mem (dev, &dev->rx_q_entry->entry);
1255 if (dev->rx_q_entry == dev->rx_q_wrap)
1256 dev->rx_q_entry = dev->rx_q_reset;
1257 else
1258 dev->rx_q_entry++;
1259 wr_regw (dev, RX_QUEUE_RD_PTR_OFF, dev->rx_q_entry - dev->rx_q_reset);
1260 spin_unlock (&dev->mem_lock);
1261 return rx_queue_entry;
1262}
1263
1264
1265
1266static inline void rx_disabled_handler (hrz_dev * dev) {
1267 wr_regw (dev, RX_CONFIG_OFF, rd_regw (dev, RX_CONFIG_OFF) | RX_ENABLE);
1268
1269 PRINTK (KERN_WARNING, "RX was disabled!");
1270}
1271
1272
1273
1274
1275static void rx_data_av_handler (hrz_dev * dev) {
1276 u32 rx_queue_entry;
1277 u32 rx_queue_entry_flags;
1278 u16 rx_len;
1279 u16 rx_channel;
1280
1281 PRINTD (DBG_FLOW, "hrz_data_av_handler");
1282
1283
1284 if (test_and_set_bit (rx_busy, &dev->flags)) {
1285 PRINTD (DBG_RX, "locked out of rx lock");
1286 return;
1287 }
1288 PRINTD (DBG_RX, "set rx_busy for dev %p", dev);
1289
1290
1291 YELLOW_LED_OFF(dev);
1292
1293 rx_queue_entry = rx_queue_entry_next (dev);
1294
1295 rx_len = rx_q_entry_to_length (rx_queue_entry);
1296 rx_channel = rx_q_entry_to_rx_channel (rx_queue_entry);
1297
1298 WAIT_FLUSH_RX_COMPLETE (dev);
1299
1300 SELECT_RX_CHANNEL (dev, rx_channel);
1301
1302 PRINTD (DBG_RX, "rx_queue_entry is: %#x", rx_queue_entry);
1303 rx_queue_entry_flags = rx_queue_entry & (RX_CRC_32_OK|RX_COMPLETE_FRAME|SIMONS_DODGEY_MARKER);
1304
1305 if (!rx_len) {
1306
1307
1308 PRINTK (KERN_ERR, "zero-length frame!");
1309 rx_queue_entry_flags &= ~RX_COMPLETE_FRAME;
1310 }
1311
1312 if (rx_queue_entry_flags & SIMONS_DODGEY_MARKER) {
1313 PRINTD (DBG_RX|DBG_ERR, "Simon's marker detected!");
1314 }
1315 if (rx_queue_entry_flags == (RX_CRC_32_OK | RX_COMPLETE_FRAME)) {
1316 struct atm_vcc * atm_vcc;
1317
1318 PRINTD (DBG_RX, "got a frame on rx_channel %x len %u", rx_channel, rx_len);
1319
1320 atm_vcc = dev->rxer[rx_channel];
1321
1322
1323
1324 if (atm_vcc) {
1325
1326 if (atm_vcc->qos.rxtp.traffic_class != ATM_NONE) {
1327
1328 if (rx_len <= atm_vcc->qos.rxtp.max_sdu) {
1329
1330 struct sk_buff * skb = atm_alloc_charge (atm_vcc, rx_len, GFP_ATOMIC);
1331 if (skb) {
1332
1333 dev->rx_skb = skb;
1334
1335 dev->rx_channel = rx_channel;
1336
1337
1338 skb_put (skb, rx_len);
1339 ATM_SKB(skb)->vcc = atm_vcc;
1340
1341
1342
1343
1344 dev->rx_bytes = rx_len;
1345 dev->rx_addr = skb->data;
1346 PRINTD (DBG_RX, "RX start simple transfer (addr %p, len %d)",
1347 skb->data, rx_len);
1348
1349
1350 rx_schedule (dev, 0);
1351 return;
1352
1353 } else {
1354 PRINTD (DBG_SKB|DBG_WARN, "failed to get skb");
1355 }
1356
1357 } else {
1358 PRINTK (KERN_INFO, "frame received on TX-only VC %x", rx_channel);
1359
1360 }
1361
1362 } else {
1363 PRINTK (KERN_WARNING, "dropped over-size frame");
1364
1365 }
1366
1367 } else {
1368 PRINTD (DBG_WARN|DBG_VCC|DBG_RX, "no VCC for this frame (VC closed)");
1369
1370 }
1371
1372 } else {
1373
1374 }
1375
1376
1377 YELLOW_LED_ON(dev);
1378
1379 FLUSH_RX_CHANNEL (dev,rx_channel);
1380 clear_bit (rx_busy, &dev->flags);
1381
1382 return;
1383}
1384
1385
1386
1387static irqreturn_t interrupt_handler(int irq, void *dev_id)
1388{
1389 hrz_dev *dev = dev_id;
1390 u32 int_source;
1391 unsigned int irq_ok;
1392
1393 PRINTD (DBG_FLOW, "interrupt_handler: %p", dev_id);
1394
1395
1396 irq_ok = 0;
1397 while ((int_source = rd_regl (dev, INT_SOURCE_REG_OFF)
1398 & INTERESTING_INTERRUPTS)) {
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415 if (int_source & RX_BUS_MASTER_COMPLETE) {
1416 ++irq_ok;
1417 PRINTD (DBG_IRQ|DBG_BUS|DBG_RX, "rx_bus_master_complete asserted");
1418 rx_bus_master_complete_handler (dev);
1419 }
1420 if (int_source & TX_BUS_MASTER_COMPLETE) {
1421 ++irq_ok;
1422 PRINTD (DBG_IRQ|DBG_BUS|DBG_TX, "tx_bus_master_complete asserted");
1423 tx_bus_master_complete_handler (dev);
1424 }
1425 if (int_source & RX_DATA_AV) {
1426 ++irq_ok;
1427 PRINTD (DBG_IRQ|DBG_RX, "rx_data_av asserted");
1428 rx_data_av_handler (dev);
1429 }
1430 }
1431 if (irq_ok) {
1432 PRINTD (DBG_IRQ, "work done: %u", irq_ok);
1433 } else {
1434 PRINTD (DBG_IRQ|DBG_WARN, "spurious interrupt source: %#x", int_source);
1435 }
1436
1437 PRINTD (DBG_IRQ|DBG_FLOW, "interrupt_handler done: %p", dev_id);
1438 if (irq_ok)
1439 return IRQ_HANDLED;
1440 return IRQ_NONE;
1441}
1442
1443
1444
1445static void do_housekeeping (unsigned long arg) {
1446
1447 hrz_dev * dev = (hrz_dev *) arg;
1448
1449
1450 dev->tx_cell_count += rd_regw (dev, TX_CELL_COUNT_OFF);
1451 dev->rx_cell_count += rd_regw (dev, RX_CELL_COUNT_OFF);
1452 dev->hec_error_count += rd_regw (dev, HEC_ERROR_COUNT_OFF);
1453 dev->unassigned_cell_count += rd_regw (dev, UNASSIGNED_CELL_COUNT_OFF);
1454
1455 mod_timer (&dev->housekeeping, jiffies + HZ/10);
1456
1457 return;
1458}
1459
1460
1461
1462
1463static short setup_idle_tx_channel (hrz_dev * dev, hrz_vcc * vcc) {
1464 unsigned short idle_channels;
1465 short tx_channel = -1;
1466 unsigned int spin_count;
1467 PRINTD (DBG_FLOW|DBG_TX, "setup_idle_tx_channel %p", dev);
1468
1469
1470
1471 spin_count = 0;
1472 while (!(idle_channels = rd_regw (dev, TX_STATUS_OFF) & IDLE_CHANNELS_MASK)) {
1473 PRINTD (DBG_TX|DBG_WARN, "waiting for idle TX channel");
1474
1475 if (++spin_count > 100) {
1476 PRINTD (DBG_TX|DBG_ERR, "spun out waiting for idle TX channel");
1477 return -EBUSY;
1478 }
1479 }
1480
1481
1482 {
1483
1484 int chan = dev->tx_idle;
1485
1486 int keep_going = 1;
1487 while (keep_going) {
1488 if (idle_channels & (1<<chan)) {
1489 tx_channel = chan;
1490 keep_going = 0;
1491 }
1492 ++chan;
1493 if (chan == TX_CHANS)
1494 chan = 0;
1495 }
1496
1497 dev->tx_idle = chan;
1498 }
1499
1500
1501 {
1502
1503
1504
1505 tx_ch_desc * tx_desc = &memmap->tx_descs[tx_channel];
1506 u32 rd_ptr;
1507 u32 wr_ptr;
1508 u16 channel = vcc->channel;
1509
1510 unsigned long flags;
1511 spin_lock_irqsave (&dev->mem_lock, flags);
1512
1513
1514 dev->tx_channel_record[tx_channel] = channel;
1515
1516
1517 update_tx_channel_config (dev, tx_channel, RATE_TYPE_ACCESS,
1518 vcc->tx_xbr_bits);
1519
1520
1521 update_tx_channel_config (dev, tx_channel, PCR_TIMER_ACCESS,
1522 vcc->tx_pcr_bits);
1523
1524#if 0
1525 if (vcc->tx_xbr_bits == VBR_RATE_TYPE) {
1526
1527 update_tx_channel_config (dev, tx_channel, SCR_TIMER_ACCESS,
1528 vcc->tx_scr_bits);
1529
1530
1531 update_tx_channel_config (dev, tx_channel, BUCKET_CAPACITY_ACCESS,
1532 vcc->tx_bucket_bits);
1533
1534
1535 update_tx_channel_config (dev, tx_channel, BUCKET_FULLNESS_ACCESS,
1536 vcc->tx_bucket_bits);
1537 }
1538#endif
1539
1540
1541 rd_ptr = rd_mem (dev, &tx_desc->rd_buf_type) & BUFFER_PTR_MASK;
1542 wr_ptr = rd_mem (dev, &tx_desc->wr_buf_type) & BUFFER_PTR_MASK;
1543
1544
1545 if (rd_ptr != wr_ptr) {
1546 PRINTD (DBG_TX|DBG_ERR, "TX buffer pointers are broken!");
1547
1548
1549 }
1550 PRINTD (DBG_TX, "TX buffer pointers are: rd %x, wr %x.",
1551 rd_ptr, wr_ptr);
1552
1553 switch (vcc->aal) {
1554 case aal0:
1555 PRINTD (DBG_QOS|DBG_TX, "tx_channel: aal0");
1556 rd_ptr |= CHANNEL_TYPE_RAW_CELLS;
1557 wr_ptr |= CHANNEL_TYPE_RAW_CELLS;
1558 break;
1559 case aal34:
1560 PRINTD (DBG_QOS|DBG_TX, "tx_channel: aal34");
1561 rd_ptr |= CHANNEL_TYPE_AAL3_4;
1562 wr_ptr |= CHANNEL_TYPE_AAL3_4;
1563 break;
1564 case aal5:
1565 rd_ptr |= CHANNEL_TYPE_AAL5;
1566 wr_ptr |= CHANNEL_TYPE_AAL5;
1567
1568 wr_mem (dev, &tx_desc->partial_crc, INITIAL_CRC);
1569 break;
1570 }
1571
1572 wr_mem (dev, &tx_desc->rd_buf_type, rd_ptr);
1573 wr_mem (dev, &tx_desc->wr_buf_type, wr_ptr);
1574
1575
1576
1577 wr_mem (dev, &tx_desc->cell_header, channel);
1578
1579 spin_unlock_irqrestore (&dev->mem_lock, flags);
1580 }
1581
1582 return tx_channel;
1583}
1584
1585
1586
1587static int hrz_send (struct atm_vcc * atm_vcc, struct sk_buff * skb) {
1588 unsigned int spin_count;
1589 int free_buffers;
1590 hrz_dev * dev = HRZ_DEV(atm_vcc->dev);
1591 hrz_vcc * vcc = HRZ_VCC(atm_vcc);
1592 u16 channel = vcc->channel;
1593
1594 u32 buffers_required;
1595
1596
1597 short tx_channel;
1598
1599 PRINTD (DBG_FLOW|DBG_TX, "hrz_send vc %x data %p len %u",
1600 channel, skb->data, skb->len);
1601
1602 dump_skb (">>>", channel, skb);
1603
1604 if (atm_vcc->qos.txtp.traffic_class == ATM_NONE) {
1605 PRINTK (KERN_ERR, "attempt to send on RX-only VC %x", channel);
1606 hrz_kfree_skb (skb);
1607 return -EIO;
1608 }
1609
1610
1611 ATM_SKB(skb)->vcc = atm_vcc;
1612
1613 if (skb->len > atm_vcc->qos.txtp.max_sdu) {
1614 PRINTK (KERN_ERR, "sk_buff length greater than agreed max_sdu, dropping...");
1615 hrz_kfree_skb (skb);
1616 return -EIO;
1617 }
1618
1619 if (!channel) {
1620 PRINTD (DBG_ERR|DBG_TX, "attempt to transmit on zero (rx_)channel");
1621 hrz_kfree_skb (skb);
1622 return -EIO;
1623 }
1624
1625#if 0
1626 {
1627
1628 u16 status;
1629 pci_read_config_word (dev->pci_dev, PCI_STATUS, &status);
1630 if (status & PCI_STATUS_REC_MASTER_ABORT) {
1631 PRINTD (DBG_BUS|DBG_ERR, "Clearing PCI Master Abort (and cleaning up)");
1632 status &= ~PCI_STATUS_REC_MASTER_ABORT;
1633 pci_write_config_word (dev->pci_dev, PCI_STATUS, status);
1634 if (test_bit (tx_busy, &dev->flags)) {
1635 hrz_kfree_skb (dev->tx_skb);
1636 tx_release (dev);
1637 }
1638 }
1639 }
1640#endif
1641
1642#ifdef DEBUG_HORIZON
1643
1644 if (channel == 1023) {
1645 unsigned int i;
1646 unsigned short d = 0;
1647 char * s = skb->data;
1648 if (*s++ == 'D') {
1649 for (i = 0; i < 4; ++i)
1650 d = (d << 4) | hex_to_bin(*s++);
1651 PRINTK (KERN_INFO, "debug bitmap is now %hx", debug = d);
1652 }
1653 }
1654#endif
1655
1656
1657 if (tx_hold (dev)) {
1658 hrz_kfree_skb (skb);
1659 return -ERESTARTSYS;
1660 }
1661
1662
1663
1664
1665
1666
1667 buffers_required = (skb->len+(ATM_AAL5_TRAILER-1)) / ATM_CELL_PAYLOAD + 3;
1668
1669
1670 spin_count = 0;
1671 while ((free_buffers = rd_regw (dev, TX_FREE_BUFFER_COUNT_OFF)) < buffers_required) {
1672 PRINTD (DBG_TX, "waiting for free TX buffers, got %d of %d",
1673 free_buffers, buffers_required);
1674
1675
1676
1677 schedule();
1678 if (++spin_count > 1000) {
1679 PRINTD (DBG_TX|DBG_ERR, "spun out waiting for tx buffers, got %d of %d",
1680 free_buffers, buffers_required);
1681 tx_release (dev);
1682 hrz_kfree_skb (skb);
1683 return -ERESTARTSYS;
1684 }
1685 }
1686
1687
1688 if (channel == dev->last_vc) {
1689 PRINTD (DBG_TX, "last vc hack: hit");
1690 tx_channel = dev->tx_last;
1691 } else {
1692 PRINTD (DBG_TX, "last vc hack: miss");
1693
1694 for (tx_channel = 0; tx_channel < TX_CHANS; ++tx_channel)
1695 if (dev->tx_channel_record[tx_channel] == channel) {
1696 PRINTD (DBG_TX, "vc already on channel: hit");
1697 break;
1698 }
1699 if (tx_channel == TX_CHANS) {
1700 PRINTD (DBG_TX, "vc already on channel: miss");
1701
1702 tx_channel = setup_idle_tx_channel (dev, vcc);
1703 if (tx_channel < 0) {
1704 PRINTD (DBG_TX|DBG_ERR, "failed to get channel");
1705 tx_release (dev);
1706 return tx_channel;
1707 }
1708 }
1709
1710 PRINTD (DBG_TX, "got channel");
1711 SELECT_TX_CHANNEL(dev, tx_channel);
1712
1713 dev->last_vc = channel;
1714 dev->tx_last = tx_channel;
1715 }
1716
1717 PRINTD (DBG_TX, "using channel %u", tx_channel);
1718
1719 YELLOW_LED_OFF(dev);
1720
1721
1722
1723 {
1724 unsigned int tx_len = skb->len;
1725 unsigned int tx_iovcnt = skb_shinfo(skb)->nr_frags;
1726
1727 dev->tx_skb = skb;
1728
1729 if (tx_iovcnt) {
1730
1731 dev->tx_regions = tx_iovcnt;
1732 dev->tx_iovec = NULL;
1733 dev->tx_bytes = 0;
1734 PRINTD (DBG_TX|DBG_BUS, "TX start scatter-gather transfer (iovec %p, len %d)",
1735 skb->data, tx_len);
1736 tx_release (dev);
1737 hrz_kfree_skb (skb);
1738 return -EIO;
1739 } else {
1740
1741 dev->tx_regions = 0;
1742 dev->tx_iovec = NULL;
1743 dev->tx_bytes = tx_len;
1744 dev->tx_addr = skb->data;
1745 PRINTD (DBG_TX|DBG_BUS, "TX start simple transfer (addr %p, len %d)",
1746 skb->data, tx_len);
1747 }
1748
1749
1750 tx_schedule (dev, 0);
1751
1752 }
1753
1754 return 0;
1755}
1756
1757
1758
1759static void hrz_reset (const hrz_dev * dev) {
1760 u32 control_0_reg = rd_regl (dev, CONTROL_0_REG);
1761
1762
1763
1764 control_0_reg = control_0_reg & RESET_HORIZON;
1765 wr_regl (dev, CONTROL_0_REG, control_0_reg);
1766 while (control_0_reg & RESET_HORIZON)
1767 control_0_reg = rd_regl (dev, CONTROL_0_REG);
1768
1769
1770 wr_regl (dev, CONTROL_0_REG, control_0_reg |
1771 RESET_ATM | RESET_RX | RESET_TX | RESET_HOST);
1772
1773 udelay (1000);
1774
1775 wr_regl (dev, CONTROL_0_REG, control_0_reg);
1776}
1777
1778
1779
1780static void WRITE_IT_WAIT (const hrz_dev *dev, u32 ctrl)
1781{
1782 wr_regl (dev, CONTROL_0_REG, ctrl);
1783 udelay (5);
1784}
1785
1786static void CLOCK_IT (const hrz_dev *dev, u32 ctrl)
1787{
1788
1789 WRITE_IT_WAIT(dev, ctrl & ~SEEPROM_SK);
1790 WRITE_IT_WAIT(dev, ctrl | SEEPROM_SK);
1791}
1792
1793static u16 __devinit read_bia (const hrz_dev * dev, u16 addr)
1794{
1795 u32 ctrl = rd_regl (dev, CONTROL_0_REG);
1796
1797 const unsigned int addr_bits = 6;
1798 const unsigned int data_bits = 16;
1799
1800 unsigned int i;
1801
1802 u16 res;
1803
1804 ctrl &= ~(SEEPROM_CS | SEEPROM_SK | SEEPROM_DI);
1805 WRITE_IT_WAIT(dev, ctrl);
1806
1807
1808 ctrl |= (SEEPROM_CS | SEEPROM_DI);
1809 CLOCK_IT(dev, ctrl);
1810
1811 ctrl |= SEEPROM_DI;
1812 CLOCK_IT(dev, ctrl);
1813
1814 ctrl &= ~SEEPROM_DI;
1815 CLOCK_IT(dev, ctrl);
1816
1817 for (i=0; i<addr_bits; i++) {
1818 if (addr & (1 << (addr_bits-1)))
1819 ctrl |= SEEPROM_DI;
1820 else
1821 ctrl &= ~SEEPROM_DI;
1822
1823 CLOCK_IT(dev, ctrl);
1824
1825 addr = addr << 1;
1826 }
1827
1828
1829 ctrl &= ~SEEPROM_DI;
1830
1831 res = 0;
1832 for (i=0;i<data_bits;i++) {
1833 res = res >> 1;
1834
1835 CLOCK_IT(dev, ctrl);
1836
1837 if (rd_regl (dev, CONTROL_0_REG) & SEEPROM_DO)
1838 res |= (1 << (data_bits-1));
1839 }
1840
1841 ctrl &= ~(SEEPROM_SK | SEEPROM_CS);
1842 WRITE_IT_WAIT(dev, ctrl);
1843
1844 return res;
1845}
1846
1847
1848
1849static int __devinit hrz_init (hrz_dev * dev) {
1850 int onefivefive;
1851
1852 u16 chan;
1853
1854 int buff_count;
1855
1856 HDW * mem;
1857
1858 cell_buf * tx_desc;
1859 cell_buf * rx_desc;
1860
1861 u32 ctrl;
1862
1863 ctrl = rd_regl (dev, CONTROL_0_REG);
1864 PRINTD (DBG_INFO, "ctrl0reg is %#x", ctrl);
1865 onefivefive = ctrl & ATM_LAYER_STATUS;
1866
1867 if (onefivefive)
1868 printk (DEV_LABEL ": Horizon Ultra (at 155.52 MBps)");
1869 else
1870 printk (DEV_LABEL ": Horizon (at 25 MBps)");
1871
1872 printk (":");
1873
1874
1875 printk (" reset");
1876 hrz_reset (dev);
1877
1878
1879
1880 printk (" clearing memory");
1881
1882 for (mem = (HDW *) memmap; mem < (HDW *) (memmap + 1); ++mem)
1883 wr_mem (dev, mem, 0);
1884
1885 printk (" tx channels");
1886
1887
1888
1889
1890
1891
1892
1893 for (chan = 0; chan < TX_CHANS; ++chan) {
1894 tx_ch_desc * tx_desc = &memmap->tx_descs[chan];
1895 cell_buf * buf = &memmap->inittxbufs[chan];
1896
1897
1898 wr_mem (dev, &tx_desc->rd_buf_type, BUF_PTR(buf));
1899 wr_mem (dev, &tx_desc->wr_buf_type, BUF_PTR(buf));
1900
1901
1902 wr_mem (dev, &buf->next, BUFF_STATUS_EMPTY);
1903 }
1904
1905
1906
1907 printk (" tx buffers");
1908
1909 tx_desc = memmap->bufn3;
1910
1911 wr_mem (dev, &memmap->txfreebufstart.next, BUF_PTR(tx_desc) | BUFF_STATUS_EMPTY);
1912
1913 for (buff_count = 0; buff_count < BUFN3_SIZE-1; buff_count++) {
1914 wr_mem (dev, &tx_desc->next, BUF_PTR(tx_desc+1) | BUFF_STATUS_EMPTY);
1915 tx_desc++;
1916 }
1917
1918 wr_mem (dev, &tx_desc->next, BUF_PTR(&memmap->txfreebufend) | BUFF_STATUS_EMPTY);
1919
1920
1921 wr_regw (dev, TX_FREE_BUFFER_COUNT_OFF, BUFN3_SIZE);
1922
1923 printk (" rx channels");
1924
1925
1926
1927
1928 for (chan = 0; chan < RX_CHANS; ++chan) {
1929 rx_ch_desc * rx_desc = &memmap->rx_descs[chan];
1930
1931 wr_mem (dev, &rx_desc->wr_buf_type, CHANNEL_TYPE_AAL5 | RX_CHANNEL_DISABLED);
1932 }
1933
1934 printk (" rx buffers");
1935
1936
1937
1938 rx_desc = memmap->bufn4;
1939
1940 wr_mem (dev, &memmap->rxfreebufstart.next, BUF_PTR(rx_desc) | BUFF_STATUS_EMPTY);
1941
1942 for (buff_count = 0; buff_count < BUFN4_SIZE-1; buff_count++) {
1943 wr_mem (dev, &rx_desc->next, BUF_PTR(rx_desc+1) | BUFF_STATUS_EMPTY);
1944
1945 rx_desc++;
1946 }
1947
1948 wr_mem (dev, &rx_desc->next, BUF_PTR(&memmap->rxfreebufend) | BUFF_STATUS_EMPTY);
1949
1950
1951 wr_regw (dev, RX_FREE_BUFFER_COUNT_OFF, BUFN4_SIZE);
1952
1953
1954
1955
1956 wr_regw (dev, TX_CONFIG_OFF,
1957 ABR_ROUND_ROBIN | TX_NORMAL_OPERATION | DRVR_DRVRBAR_ENABLE);
1958
1959
1960 wr_regw (dev, RX_CONFIG_OFF,
1961 DISCARD_UNUSED_VPI_VCI_BITS_SET | NON_USER_CELLS_IN_ONE_CHANNEL | vpi_bits);
1962
1963
1964 wr_regw (dev, RX_LINE_CONFIG_OFF,
1965 LOCK_DETECT_ENABLE | FREQUENCY_DETECT_ENABLE | GXTALOUT_SELECT_DIV4);
1966
1967
1968
1969 wr_regw (dev, MAX_AAL5_CELL_COUNT_OFF,
1970 DIV_ROUND_UP(max_rx_size + ATM_AAL5_TRAILER, ATM_CELL_PAYLOAD));
1971
1972
1973 wr_regw (dev, RX_CONFIG_OFF, rd_regw (dev, RX_CONFIG_OFF) | RX_ENABLE);
1974
1975 printk (" control");
1976
1977
1978 ctrl |= GREEN_LED_OE | YELLOW_LED_OE | GREEN_LED | YELLOW_LED;
1979 wr_regl (dev, CONTROL_0_REG, ctrl);
1980
1981
1982
1983 if (onefivefive) {
1984
1985
1986 ctrl |= ATM_LAYER_SELECT;
1987 wr_regl (dev, CONTROL_0_REG, ctrl);
1988
1989
1990
1991
1992
1993
1994
1995 if (rd_framer (dev, 0) & 0x00f0) {
1996
1997 printk (" SUNI");
1998
1999
2000 wr_framer (dev, 0x00, 0x0080);
2001 wr_framer (dev, 0x00, 0x0000);
2002
2003
2004 wr_framer (dev, 0x63, rd_framer (dev, 0x63) | 0x0002);
2005
2006
2007 wr_framer (dev, 0x05, rd_framer (dev, 0x05) | 0x0001);
2008 } else {
2009
2010 printk (" SAMBA");
2011
2012
2013 wr_framer (dev, 0, rd_framer (dev, 0) | 0x0001);
2014 wr_framer (dev, 0, rd_framer (dev, 0) &~ 0x0001);
2015
2016
2017 wr_framer (dev, 0, 0x0002);
2018
2019
2020 wr_framer (dev, 2, 0x0B80);
2021 }
2022 } else {
2023
2024 ctrl &= ~ATM_LAYER_SELECT;
2025
2026
2027
2028 }
2029
2030 printk (" LEDs");
2031
2032 GREEN_LED_ON(dev);
2033 YELLOW_LED_ON(dev);
2034
2035 printk (" ESI=");
2036
2037 {
2038 u16 b = 0;
2039 int i;
2040 u8 * esi = dev->atm_dev->esi;
2041
2042
2043
2044
2045
2046
2047
2048 for (i=0; i < ESI_LEN; ++i) {
2049 if (i % 2 == 0)
2050 b = read_bia (dev, i/2 + 2);
2051 else
2052 b = b >> 8;
2053 esi[i] = b & 0xFF;
2054 printk ("%02x", esi[i]);
2055 }
2056 }
2057
2058
2059 wr_regl (dev, INT_ENABLE_REG_OFF, INTERESTING_INTERRUPTS);
2060 printk (" IRQ on");
2061
2062 printk (".\n");
2063
2064 return onefivefive;
2065}
2066
2067
2068
2069static int check_max_sdu (hrz_aal aal, struct atm_trafprm * tp, unsigned int max_frame_size) {
2070 PRINTD (DBG_FLOW|DBG_QOS, "check_max_sdu");
2071
2072 switch (aal) {
2073 case aal0:
2074 if (!(tp->max_sdu)) {
2075 PRINTD (DBG_QOS, "defaulting max_sdu");
2076 tp->max_sdu = ATM_AAL0_SDU;
2077 } else if (tp->max_sdu != ATM_AAL0_SDU) {
2078 PRINTD (DBG_QOS|DBG_ERR, "rejecting max_sdu");
2079 return -EINVAL;
2080 }
2081 break;
2082 case aal34:
2083 if (tp->max_sdu == 0 || tp->max_sdu > ATM_MAX_AAL34_PDU) {
2084 PRINTD (DBG_QOS, "%sing max_sdu", tp->max_sdu ? "capp" : "default");
2085 tp->max_sdu = ATM_MAX_AAL34_PDU;
2086 }
2087 break;
2088 case aal5:
2089 if (tp->max_sdu == 0 || tp->max_sdu > max_frame_size) {
2090 PRINTD (DBG_QOS, "%sing max_sdu", tp->max_sdu ? "capp" : "default");
2091 tp->max_sdu = max_frame_size;
2092 }
2093 break;
2094 }
2095 return 0;
2096}
2097
2098
2099
2100
2101static int atm_pcr_check (struct atm_trafprm * tp, unsigned int pcr) {
2102
2103 if (tp->min_pcr == ATM_MAX_PCR)
2104 PRINTD (DBG_QOS, "luser gave min_pcr = ATM_MAX_PCR");
2105 else if (tp->min_pcr < 0)
2106 PRINTD (DBG_QOS, "luser gave negative min_pcr");
2107 else if (tp->min_pcr && tp->min_pcr > pcr)
2108 PRINTD (DBG_QOS, "pcr less than min_pcr");
2109 else
2110
2111
2112
2113 if ((0) && tp->max_pcr == ATM_MAX_PCR)
2114 PRINTD (DBG_QOS, "luser gave max_pcr = ATM_MAX_PCR");
2115 else if ((tp->max_pcr != ATM_MAX_PCR) && tp->max_pcr < 0)
2116 PRINTD (DBG_QOS, "luser gave negative max_pcr");
2117 else if (tp->max_pcr && tp->max_pcr != ATM_MAX_PCR && tp->max_pcr < pcr)
2118 PRINTD (DBG_QOS, "pcr greater than max_pcr");
2119 else {
2120
2121 PRINTD (DBG_QOS, "xBR(pcr) OK");
2122 return 0;
2123 }
2124 PRINTD (DBG_QOS, "pcr=%u, tp: min_pcr=%d, pcr=%d, max_pcr=%d",
2125 pcr, tp->min_pcr, tp->pcr, tp->max_pcr);
2126 return -EINVAL;
2127}
2128
2129
2130
2131static int hrz_open (struct atm_vcc *atm_vcc)
2132{
2133 int error;
2134 u16 channel;
2135
2136 struct atm_qos * qos;
2137 struct atm_trafprm * txtp;
2138 struct atm_trafprm * rxtp;
2139
2140 hrz_dev * dev = HRZ_DEV(atm_vcc->dev);
2141 hrz_vcc vcc;
2142 hrz_vcc * vccp;
2143 short vpi = atm_vcc->vpi;
2144 int vci = atm_vcc->vci;
2145 PRINTD (DBG_FLOW|DBG_VCC, "hrz_open %x %x", vpi, vci);
2146
2147#ifdef ATM_VPI_UNSPEC
2148
2149 if (vpi == ATM_VPI_UNSPEC || vci == ATM_VCI_UNSPEC) {
2150 PRINTK (KERN_WARNING, "rejecting open with unspecified VPI/VCI (deprecated)");
2151 return -EINVAL;
2152 }
2153#endif
2154
2155 error = vpivci_to_channel (&channel, vpi, vci);
2156 if (error) {
2157 PRINTD (DBG_WARN|DBG_VCC, "VPI/VCI out of range: %hd/%d", vpi, vci);
2158 return error;
2159 }
2160
2161 vcc.channel = channel;
2162
2163 vcc.tx_rate = 0x0;
2164
2165 qos = &atm_vcc->qos;
2166
2167
2168 switch (qos->aal) {
2169 case ATM_AAL0:
2170
2171 PRINTD (DBG_QOS|DBG_VCC, "AAL0");
2172 vcc.aal = aal0;
2173 break;
2174 case ATM_AAL34:
2175
2176 PRINTD (DBG_QOS|DBG_VCC, "AAL3/4");
2177 vcc.aal = aal34;
2178 break;
2179 case ATM_AAL5:
2180 PRINTD (DBG_QOS|DBG_VCC, "AAL5");
2181 vcc.aal = aal5;
2182 break;
2183 default:
2184 PRINTD (DBG_QOS|DBG_VCC, "Bad AAL!");
2185 return -EINVAL;
2186 break;
2187 }
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223 PRINTD (DBG_QOS, "TX:");
2224
2225 txtp = &qos->txtp;
2226
2227
2228 vcc.tx_rate = 0;
2229
2230 vcc.tx_xbr_bits = IDLE_RATE_TYPE;
2231 vcc.tx_pcr_bits = CLOCK_DISABLE;
2232#if 0
2233 vcc.tx_scr_bits = CLOCK_DISABLE;
2234 vcc.tx_bucket_bits = 0;
2235#endif
2236
2237 if (txtp->traffic_class != ATM_NONE) {
2238 error = check_max_sdu (vcc.aal, txtp, max_tx_size);
2239 if (error) {
2240 PRINTD (DBG_QOS, "TX max_sdu check failed");
2241 return error;
2242 }
2243
2244 switch (txtp->traffic_class) {
2245 case ATM_UBR: {
2246
2247
2248 vcc.tx_rate = 0;
2249 make_rate (dev, 1<<30, round_nearest, &vcc.tx_pcr_bits, NULL);
2250 vcc.tx_xbr_bits = ABR_RATE_TYPE;
2251 break;
2252 }
2253#if 0
2254 case ATM_ABR: {
2255
2256 vcc.tx_rate = 0;
2257 make_rate (dev, 1<<30, round_nearest, &vcc.tx_pcr_bits, 0);
2258 vcc.tx_xbr_bits = ABR_RATE_TYPE;
2259 break;
2260 }
2261#endif
2262 case ATM_CBR: {
2263 int pcr = atm_pcr_goal (txtp);
2264 rounding r;
2265 if (!pcr) {
2266
2267
2268
2269
2270
2271 r = round_down;
2272
2273
2274 PRINTD (DBG_QOS, "snatching all remaining TX bandwidth");
2275 pcr = dev->tx_avail;
2276 } else if (pcr < 0) {
2277 r = round_down;
2278 pcr = -pcr;
2279 } else {
2280 r = round_up;
2281 }
2282 error = make_rate_with_tolerance (dev, pcr, r, 10,
2283 &vcc.tx_pcr_bits, &vcc.tx_rate);
2284 if (error) {
2285 PRINTD (DBG_QOS, "could not make rate from TX PCR");
2286 return error;
2287 }
2288
2289 error = atm_pcr_check (txtp, vcc.tx_rate);
2290 if (error) {
2291 PRINTD (DBG_QOS, "TX PCR failed consistency check");
2292 return error;
2293 }
2294 vcc.tx_xbr_bits = CBR_RATE_TYPE;
2295 break;
2296 }
2297#if 0
2298 case ATM_VBR: {
2299 int pcr = atm_pcr_goal (txtp);
2300
2301 int scr = pcr/2;
2302 unsigned int mbs = 60;
2303 rounding pr;
2304 rounding sr;
2305 unsigned int bucket;
2306 if (!pcr) {
2307 pr = round_nearest;
2308 pcr = 1<<30;
2309 } else if (pcr < 0) {
2310 pr = round_down;
2311 pcr = -pcr;
2312 } else {
2313 pr = round_up;
2314 }
2315 error = make_rate_with_tolerance (dev, pcr, pr, 10,
2316 &vcc.tx_pcr_bits, 0);
2317 if (!scr) {
2318
2319 sr = round_down;
2320
2321
2322 PRINTD (DBG_QOS, "snatching all remaining TX bandwidth");
2323 scr = dev->tx_avail;
2324 } else if (scr < 0) {
2325 sr = round_down;
2326 scr = -scr;
2327 } else {
2328 sr = round_up;
2329 }
2330 error = make_rate_with_tolerance (dev, scr, sr, 10,
2331 &vcc.tx_scr_bits, &vcc.tx_rate);
2332 if (error) {
2333 PRINTD (DBG_QOS, "could not make rate from TX SCR");
2334 return error;
2335 }
2336
2337
2338 if (error) {
2339 PRINTD (DBG_QOS, "TX SCR failed consistency check");
2340 return error;
2341 }
2342
2343
2344
2345 bucket = mbs*(pcr-scr)/pcr;
2346 if (bucket*pcr != mbs*(pcr-scr))
2347 bucket += 1;
2348 if (bucket > BUCKET_MAX_SIZE) {
2349 PRINTD (DBG_QOS, "shrinking bucket from %u to %u",
2350 bucket, BUCKET_MAX_SIZE);
2351 bucket = BUCKET_MAX_SIZE;
2352 }
2353 vcc.tx_xbr_bits = VBR_RATE_TYPE;
2354 vcc.tx_bucket_bits = bucket;
2355 break;
2356 }
2357#endif
2358 default: {
2359 PRINTD (DBG_QOS, "unsupported TX traffic class");
2360 return -EINVAL;
2361 break;
2362 }
2363 }
2364 }
2365
2366
2367
2368 PRINTD (DBG_QOS, "RX:");
2369
2370 rxtp = &qos->rxtp;
2371
2372
2373 vcc.rx_rate = 0;
2374
2375 if (rxtp->traffic_class != ATM_NONE) {
2376 error = check_max_sdu (vcc.aal, rxtp, max_rx_size);
2377 if (error) {
2378 PRINTD (DBG_QOS, "RX max_sdu check failed");
2379 return error;
2380 }
2381 switch (rxtp->traffic_class) {
2382 case ATM_UBR: {
2383
2384 break;
2385 }
2386#if 0
2387 case ATM_ABR: {
2388
2389 vcc.rx_rate = 0;
2390 break;
2391 }
2392#endif
2393 case ATM_CBR: {
2394 int pcr = atm_pcr_goal (rxtp);
2395 if (!pcr) {
2396
2397
2398 PRINTD (DBG_QOS, "snatching all remaining RX bandwidth");
2399 pcr = dev->rx_avail;
2400 } else if (pcr < 0) {
2401 pcr = -pcr;
2402 }
2403 vcc.rx_rate = pcr;
2404
2405 error = atm_pcr_check (rxtp, vcc.rx_rate);
2406 if (error) {
2407 PRINTD (DBG_QOS, "RX PCR failed consistency check");
2408 return error;
2409 }
2410 break;
2411 }
2412#if 0
2413 case ATM_VBR: {
2414
2415 int scr = 1<<16;
2416 if (!scr) {
2417
2418
2419 PRINTD (DBG_QOS, "snatching all remaining RX bandwidth");
2420 scr = dev->rx_avail;
2421 } else if (scr < 0) {
2422 scr = -scr;
2423 }
2424 vcc.rx_rate = scr;
2425
2426
2427 if (error) {
2428 PRINTD (DBG_QOS, "RX SCR failed consistency check");
2429 return error;
2430 }
2431 break;
2432 }
2433#endif
2434 default: {
2435 PRINTD (DBG_QOS, "unsupported RX traffic class");
2436 return -EINVAL;
2437 break;
2438 }
2439 }
2440 }
2441
2442
2443
2444 if (vcc.aal != aal5) {
2445 PRINTD (DBG_QOS, "AAL not supported");
2446 return -EINVAL;
2447 }
2448
2449
2450 vccp = kmalloc (sizeof(hrz_vcc), GFP_KERNEL);
2451 if (!vccp) {
2452 PRINTK (KERN_ERR, "out of memory!");
2453 return -ENOMEM;
2454 }
2455 *vccp = vcc;
2456
2457
2458 error = 0;
2459 spin_lock (&dev->rate_lock);
2460
2461 if (vcc.tx_rate > dev->tx_avail) {
2462 PRINTD (DBG_QOS, "not enough TX PCR left");
2463 error = -EAGAIN;
2464 }
2465
2466 if (vcc.rx_rate > dev->rx_avail) {
2467 PRINTD (DBG_QOS, "not enough RX PCR left");
2468 error = -EAGAIN;
2469 }
2470
2471 if (!error) {
2472
2473 dev->tx_avail -= vcc.tx_rate;
2474 dev->rx_avail -= vcc.rx_rate;
2475 PRINTD (DBG_QOS|DBG_VCC, "reserving %u TX PCR and %u RX PCR",
2476 vcc.tx_rate, vcc.rx_rate);
2477 }
2478
2479
2480 spin_unlock (&dev->rate_lock);
2481 if (error) {
2482 PRINTD (DBG_QOS|DBG_VCC, "insufficient cell rate resources");
2483 kfree (vccp);
2484 return error;
2485 }
2486
2487
2488
2489 set_bit(ATM_VF_ADDR,&atm_vcc->flags);
2490
2491
2492
2493 if (rxtp->traffic_class != ATM_NONE) {
2494 if (dev->rxer[channel]) {
2495 PRINTD (DBG_ERR|DBG_VCC, "VC already open for RX");
2496 error = -EBUSY;
2497 }
2498 if (!error)
2499 error = hrz_open_rx (dev, channel);
2500 if (error) {
2501 kfree (vccp);
2502 return error;
2503 }
2504
2505 dev->rxer[channel] = atm_vcc;
2506 }
2507
2508
2509 atm_vcc->dev_data = (void *) vccp;
2510
2511
2512 set_bit(ATM_VF_READY,&atm_vcc->flags);
2513
2514 return 0;
2515}
2516
2517
2518
2519static void hrz_close (struct atm_vcc * atm_vcc) {
2520 hrz_dev * dev = HRZ_DEV(atm_vcc->dev);
2521 hrz_vcc * vcc = HRZ_VCC(atm_vcc);
2522 u16 channel = vcc->channel;
2523 PRINTD (DBG_VCC|DBG_FLOW, "hrz_close");
2524
2525
2526 clear_bit(ATM_VF_READY,&atm_vcc->flags);
2527
2528 if (atm_vcc->qos.txtp.traffic_class != ATM_NONE) {
2529 unsigned int i;
2530
2531
2532
2533 while (tx_hold (dev))
2534 ;
2535
2536 for (i = 0; i < TX_CHANS; ++i)
2537 if (dev->tx_channel_record[i] == channel) {
2538 dev->tx_channel_record[i] = -1;
2539 break;
2540 }
2541 if (dev->last_vc == channel)
2542 dev->tx_last = -1;
2543 tx_release (dev);
2544 }
2545
2546 if (atm_vcc->qos.rxtp.traffic_class != ATM_NONE) {
2547
2548 hrz_close_rx (dev, channel);
2549
2550 if (atm_vcc != dev->rxer[channel])
2551 PRINTK (KERN_ERR, "%s atm_vcc=%p rxer[channel]=%p",
2552 "arghhh! we're going to die!",
2553 atm_vcc, dev->rxer[channel]);
2554 dev->rxer[channel] = NULL;
2555 }
2556
2557
2558 spin_lock (&dev->rate_lock);
2559 PRINTD (DBG_QOS|DBG_VCC, "releasing %u TX PCR and %u RX PCR",
2560 vcc->tx_rate, vcc->rx_rate);
2561 dev->tx_avail += vcc->tx_rate;
2562 dev->rx_avail += vcc->rx_rate;
2563 spin_unlock (&dev->rate_lock);
2564
2565
2566 kfree (vcc);
2567
2568 clear_bit(ATM_VF_ADDR,&atm_vcc->flags);
2569}
2570
2571#if 0
2572static int hrz_getsockopt (struct atm_vcc * atm_vcc, int level, int optname,
2573 void *optval, int optlen) {
2574 hrz_dev * dev = HRZ_DEV(atm_vcc->dev);
2575 PRINTD (DBG_FLOW|DBG_VCC, "hrz_getsockopt");
2576 switch (level) {
2577 case SOL_SOCKET:
2578 switch (optname) {
2579
2580
2581
2582
2583 default:
2584 return -ENOPROTOOPT;
2585 break;
2586 };
2587 break;
2588 }
2589 return -EINVAL;
2590}
2591
2592static int hrz_setsockopt (struct atm_vcc * atm_vcc, int level, int optname,
2593 void *optval, unsigned int optlen) {
2594 hrz_dev * dev = HRZ_DEV(atm_vcc->dev);
2595 PRINTD (DBG_FLOW|DBG_VCC, "hrz_setsockopt");
2596 switch (level) {
2597 case SOL_SOCKET:
2598 switch (optname) {
2599
2600
2601
2602
2603 default:
2604 return -ENOPROTOOPT;
2605 break;
2606 };
2607 break;
2608 }
2609 return -EINVAL;
2610}
2611#endif
2612
2613#if 0
2614static int hrz_ioctl (struct atm_dev * atm_dev, unsigned int cmd, void *arg) {
2615 hrz_dev * dev = HRZ_DEV(atm_dev);
2616 PRINTD (DBG_FLOW, "hrz_ioctl");
2617 return -1;
2618}
2619
2620unsigned char hrz_phy_get (struct atm_dev * atm_dev, unsigned long addr) {
2621 hrz_dev * dev = HRZ_DEV(atm_dev);
2622 PRINTD (DBG_FLOW, "hrz_phy_get");
2623 return 0;
2624}
2625
2626static void hrz_phy_put (struct atm_dev * atm_dev, unsigned char value,
2627 unsigned long addr) {
2628 hrz_dev * dev = HRZ_DEV(atm_dev);
2629 PRINTD (DBG_FLOW, "hrz_phy_put");
2630}
2631
2632static int hrz_change_qos (struct atm_vcc * atm_vcc, struct atm_qos *qos, int flgs) {
2633 hrz_dev * dev = HRZ_DEV(vcc->dev);
2634 PRINTD (DBG_FLOW, "hrz_change_qos");
2635 return -1;
2636}
2637#endif
2638
2639
2640
2641static int hrz_proc_read (struct atm_dev * atm_dev, loff_t * pos, char * page) {
2642 hrz_dev * dev = HRZ_DEV(atm_dev);
2643 int left = *pos;
2644 PRINTD (DBG_FLOW, "hrz_proc_read");
2645
2646
2647
2648#if 0
2649 if (!left--) {
2650 unsigned int count = sprintf (page, "vbr buckets:");
2651 unsigned int i;
2652 for (i = 0; i < TX_CHANS; ++i)
2653 count += sprintf (page, " %u/%u",
2654 query_tx_channel_config (dev, i, BUCKET_FULLNESS_ACCESS),
2655 query_tx_channel_config (dev, i, BUCKET_CAPACITY_ACCESS));
2656 count += sprintf (page+count, ".\n");
2657 return count;
2658 }
2659#endif
2660
2661 if (!left--)
2662 return sprintf (page,
2663 "cells: TX %lu, RX %lu, HEC errors %lu, unassigned %lu.\n",
2664 dev->tx_cell_count, dev->rx_cell_count,
2665 dev->hec_error_count, dev->unassigned_cell_count);
2666
2667 if (!left--)
2668 return sprintf (page,
2669 "free cell buffers: TX %hu, RX %hu+%hu.\n",
2670 rd_regw (dev, TX_FREE_BUFFER_COUNT_OFF),
2671 rd_regw (dev, RX_FREE_BUFFER_COUNT_OFF),
2672 dev->noof_spare_buffers);
2673
2674 if (!left--)
2675 return sprintf (page,
2676 "cps remaining: TX %u, RX %u\n",
2677 dev->tx_avail, dev->rx_avail);
2678
2679 return 0;
2680}
2681
2682static const struct atmdev_ops hrz_ops = {
2683 .open = hrz_open,
2684 .close = hrz_close,
2685 .send = hrz_send,
2686 .proc_read = hrz_proc_read,
2687 .owner = THIS_MODULE,
2688};
2689
2690static int __devinit hrz_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
2691{
2692 hrz_dev * dev;
2693 int err = 0;
2694
2695
2696 u32 iobase = pci_resource_start (pci_dev, 0);
2697 u32 * membase = bus_to_virt (pci_resource_start (pci_dev, 1));
2698 unsigned int irq;
2699 unsigned char lat;
2700
2701 PRINTD (DBG_FLOW, "hrz_probe");
2702
2703 if (pci_enable_device(pci_dev))
2704 return -EINVAL;
2705
2706
2707 if (!request_region(iobase, HRZ_IO_EXTENT, DEV_LABEL)) {
2708 err = -EINVAL;
2709 goto out_disable;
2710 }
2711
2712 dev = kzalloc(sizeof(hrz_dev), GFP_KERNEL);
2713 if (!dev) {
2714
2715 PRINTD(DBG_ERR, "out of memory");
2716 err = -ENOMEM;
2717 goto out_release;
2718 }
2719
2720 pci_set_drvdata(pci_dev, dev);
2721
2722
2723 irq = pci_dev->irq;
2724 if (request_irq(irq,
2725 interrupt_handler,
2726 IRQF_SHARED,
2727 DEV_LABEL,
2728 dev)) {
2729 PRINTD(DBG_WARN, "request IRQ failed!");
2730 err = -EINVAL;
2731 goto out_free;
2732 }
2733
2734 PRINTD(DBG_INFO, "found Madge ATM adapter (hrz) at: IO %x, IRQ %u, MEM %p",
2735 iobase, irq, membase);
2736
2737 dev->atm_dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &hrz_ops, -1,
2738 NULL);
2739 if (!(dev->atm_dev)) {
2740 PRINTD(DBG_ERR, "failed to register Madge ATM adapter");
2741 err = -EINVAL;
2742 goto out_free_irq;
2743 }
2744
2745 PRINTD(DBG_INFO, "registered Madge ATM adapter (no. %d) (%p) at %p",
2746 dev->atm_dev->number, dev, dev->atm_dev);
2747 dev->atm_dev->dev_data = (void *) dev;
2748 dev->pci_dev = pci_dev;
2749
2750
2751 pci_set_master(pci_dev);
2752
2753
2754 pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &lat);
2755 if (pci_lat) {
2756 PRINTD(DBG_INFO, "%s PCI latency timer from %hu to %hu",
2757 "changing", lat, pci_lat);
2758 pci_write_config_byte(pci_dev, PCI_LATENCY_TIMER, pci_lat);
2759 } else if (lat < MIN_PCI_LATENCY) {
2760 PRINTK(KERN_INFO, "%s PCI latency timer from %hu to %hu",
2761 "increasing", lat, MIN_PCI_LATENCY);
2762 pci_write_config_byte(pci_dev, PCI_LATENCY_TIMER, MIN_PCI_LATENCY);
2763 }
2764
2765 dev->iobase = iobase;
2766 dev->irq = irq;
2767 dev->membase = membase;
2768
2769 dev->rx_q_entry = dev->rx_q_reset = &memmap->rx_q_entries[0];
2770 dev->rx_q_wrap = &memmap->rx_q_entries[RX_CHANS-1];
2771
2772
2773 dev->last_vc = -1;
2774 dev->tx_last = -1;
2775 dev->tx_idle = 0;
2776
2777 dev->tx_regions = 0;
2778 dev->tx_bytes = 0;
2779 dev->tx_skb = NULL;
2780 dev->tx_iovec = NULL;
2781
2782 dev->tx_cell_count = 0;
2783 dev->rx_cell_count = 0;
2784 dev->hec_error_count = 0;
2785 dev->unassigned_cell_count = 0;
2786
2787 dev->noof_spare_buffers = 0;
2788
2789 {
2790 unsigned int i;
2791 for (i = 0; i < TX_CHANS; ++i)
2792 dev->tx_channel_record[i] = -1;
2793 }
2794
2795 dev->flags = 0;
2796
2797
2798
2799
2800
2801
2802 if (hrz_init(dev)) {
2803
2804 dev->tx_avail = ATM_OC3_PCR;
2805 dev->rx_avail = ATM_OC3_PCR;
2806 set_bit(ultra, &dev->flags);
2807 } else {
2808 dev->tx_avail = ((25600000/8)*26)/(27*53);
2809 dev->rx_avail = ((25600000/8)*26)/(27*53);
2810 PRINTD(DBG_WARN, "Buggy ASIC: no TX bus-mastering.");
2811 }
2812
2813
2814 spin_lock_init(&dev->rate_lock);
2815
2816
2817
2818 spin_lock_init(&dev->mem_lock);
2819
2820 init_waitqueue_head(&dev->tx_queue);
2821
2822
2823 dev->atm_dev->ci_range.vpi_bits = vpi_bits;
2824 dev->atm_dev->ci_range.vci_bits = 10-vpi_bits;
2825
2826 init_timer(&dev->housekeeping);
2827 dev->housekeeping.function = do_housekeeping;
2828 dev->housekeeping.data = (unsigned long) dev;
2829 mod_timer(&dev->housekeeping, jiffies);
2830
2831out:
2832 return err;
2833
2834out_free_irq:
2835 free_irq(dev->irq, dev);
2836out_free:
2837 kfree(dev);
2838out_release:
2839 release_region(iobase, HRZ_IO_EXTENT);
2840out_disable:
2841 pci_disable_device(pci_dev);
2842 goto out;
2843}
2844
2845static void __devexit hrz_remove_one(struct pci_dev *pci_dev)
2846{
2847 hrz_dev *dev;
2848
2849 dev = pci_get_drvdata(pci_dev);
2850
2851 PRINTD(DBG_INFO, "closing %p (atm_dev = %p)", dev, dev->atm_dev);
2852 del_timer_sync(&dev->housekeeping);
2853 hrz_reset(dev);
2854 atm_dev_deregister(dev->atm_dev);
2855 free_irq(dev->irq, dev);
2856 release_region(dev->iobase, HRZ_IO_EXTENT);
2857 kfree(dev);
2858
2859 pci_disable_device(pci_dev);
2860}
2861
2862static void __init hrz_check_args (void) {
2863#ifdef DEBUG_HORIZON
2864 PRINTK (KERN_NOTICE, "debug bitmap is %hx", debug &= DBG_MASK);
2865#else
2866 if (debug)
2867 PRINTK (KERN_NOTICE, "no debug support in this image");
2868#endif
2869
2870 if (vpi_bits > HRZ_MAX_VPI)
2871 PRINTK (KERN_ERR, "vpi_bits has been limited to %hu",
2872 vpi_bits = HRZ_MAX_VPI);
2873
2874 if (max_tx_size < 0 || max_tx_size > TX_AAL5_LIMIT)
2875 PRINTK (KERN_NOTICE, "max_tx_size has been limited to %hu",
2876 max_tx_size = TX_AAL5_LIMIT);
2877
2878 if (max_rx_size < 0 || max_rx_size > RX_AAL5_LIMIT)
2879 PRINTK (KERN_NOTICE, "max_rx_size has been limited to %hu",
2880 max_rx_size = RX_AAL5_LIMIT);
2881
2882 return;
2883}
2884
2885MODULE_AUTHOR(maintainer_string);
2886MODULE_DESCRIPTION(description_string);
2887MODULE_LICENSE("GPL");
2888module_param(debug, ushort, 0644);
2889module_param(vpi_bits, ushort, 0);
2890module_param(max_tx_size, int, 0);
2891module_param(max_rx_size, int, 0);
2892module_param(pci_lat, byte, 0);
2893MODULE_PARM_DESC(debug, "debug bitmap, see .h file");
2894MODULE_PARM_DESC(vpi_bits, "number of bits (0..4) to allocate to VPIs");
2895MODULE_PARM_DESC(max_tx_size, "maximum size of TX AAL5 frames");
2896MODULE_PARM_DESC(max_rx_size, "maximum size of RX AAL5 frames");
2897MODULE_PARM_DESC(pci_lat, "PCI latency in bus cycles");
2898
2899static struct pci_device_id hrz_pci_tbl[] = {
2900 { PCI_VENDOR_ID_MADGE, PCI_DEVICE_ID_MADGE_HORIZON, PCI_ANY_ID, PCI_ANY_ID,
2901 0, 0, 0 },
2902 { 0, }
2903};
2904
2905MODULE_DEVICE_TABLE(pci, hrz_pci_tbl);
2906
2907static struct pci_driver hrz_driver = {
2908 .name = "horizon",
2909 .probe = hrz_probe,
2910 .remove = __devexit_p(hrz_remove_one),
2911 .id_table = hrz_pci_tbl,
2912};
2913
2914
2915
2916static int __init hrz_module_init (void) {
2917
2918 if (sizeof(struct MEMMAP) != 128*1024/4) {
2919 PRINTK (KERN_ERR, "Fix struct MEMMAP (is %lu fakewords).",
2920 (unsigned long) sizeof(struct MEMMAP));
2921 return -ENOMEM;
2922 }
2923
2924 show_version();
2925
2926
2927 hrz_check_args();
2928
2929
2930 return pci_register_driver(&hrz_driver);
2931}
2932
2933
2934
2935static void __exit hrz_module_exit (void) {
2936 PRINTD (DBG_FLOW, "cleanup_module");
2937
2938 pci_unregister_driver(&hrz_driver);
2939}
2940
2941module_init(hrz_module_init);
2942module_exit(hrz_module_exit);
2943