1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#ifndef AMBASSADOR_H
24#define AMBASSADOR_H
25
26
27#ifdef CONFIG_ATM_AMBASSADOR_DEBUG
28#define DEBUG_AMBASSADOR
29#endif
30
31#define DEV_LABEL "amb"
32
33#ifndef PCI_VENDOR_ID_MADGE
34#define PCI_VENDOR_ID_MADGE 0x10B6
35#endif
36#ifndef PCI_VENDOR_ID_MADGE_AMBASSADOR
37#define PCI_DEVICE_ID_MADGE_AMBASSADOR 0x1001
38#endif
39#ifndef PCI_VENDOR_ID_MADGE_AMBASSADOR_BAD
40#define PCI_DEVICE_ID_MADGE_AMBASSADOR_BAD 0x1002
41#endif
42
43
44
45#define PRINTK(severity,format,args...) \
46 printk(severity DEV_LABEL ": " format "\n" , ## args)
47
48#ifdef DEBUG_AMBASSADOR
49
50#define DBG_ERR 0x0001
51#define DBG_WARN 0x0002
52#define DBG_INFO 0x0004
53#define DBG_INIT 0x0008
54#define DBG_LOAD 0x0010
55#define DBG_VCC 0x0020
56#define DBG_QOS 0x0040
57#define DBG_CMD 0x0080
58#define DBG_TX 0x0100
59#define DBG_RX 0x0200
60#define DBG_SKB 0x0400
61#define DBG_POOL 0x0800
62#define DBG_IRQ 0x1000
63#define DBG_FLOW 0x2000
64#define DBG_REGS 0x4000
65#define DBG_DATA 0x8000
66#define DBG_MASK 0xffff
67
68
69
70#define PRINTDB(bits,format,args...) \
71 ( (debug & (bits)) ? printk (KERN_INFO DEV_LABEL ": " format , ## args) : 1 )
72#define PRINTDM(bits,format,args...) \
73 ( (debug & (bits)) ? printk (format , ## args) : 1 )
74#define PRINTDE(bits,format,args...) \
75 ( (debug & (bits)) ? printk (format "\n" , ## args) : 1 )
76#define PRINTD(bits,format,args...) \
77 ( (debug & (bits)) ? printk (KERN_INFO DEV_LABEL ": " format "\n" , ## args) : 1 )
78
79#else
80
81#define PRINTD(bits,format,args...)
82#define PRINTDB(bits,format,args...)
83#define PRINTDM(bits,format,args...)
84#define PRINTDE(bits,format,args...)
85
86#endif
87
88#define PRINTDD(bits,format,args...)
89#define PRINTDDB(sec,fmt,args...)
90#define PRINTDDM(sec,fmt,args...)
91#define PRINTDDE(sec,fmt,args...)
92
93
94
95
96#define COM_Q_ENTRIES 8
97#define TX_Q_ENTRIES 32
98#define RX_Q_ENTRIES 64
99
100
101
102
103#define AMB_EXTENT 0x80
104
105
106#define MIN_QUEUE_SIZE 2
107
108
109#define NUM_RX_POOLS 4
110
111
112#define MIN_RX_BUFFERS 1
113
114
115#define MIN_PCI_LATENCY 64
116
117
118#define NUM_VPI_BITS 0
119#define NUM_VCI_BITS 10
120#define NUM_VCS 1024
121
122
123#define RX_ERR 0x8000
124#define CRC_ERR 0x4000
125#define LEN_ERR 0x2000
126#define ABORT_ERR 0x1000
127#define UNUSED_ERR 0x0800
128
129
130
131#define SRB_OPEN_VC 0
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147#define SRB_CLOSE_VC 1
148
149
150#define SRB_GET_BIA 2
151
152
153
154
155#define SRB_GET_SUNI_STATS 3
156
157
158#define SRB_SET_BITS_8 4
159#define SRB_SET_BITS_16 5
160#define SRB_SET_BITS_32 6
161#define SRB_CLEAR_BITS_8 7
162#define SRB_CLEAR_BITS_16 8
163#define SRB_CLEAR_BITS_32 9
164
165
166
167#define SRB_SET_8 10
168#define SRB_SET_16 11
169#define SRB_SET_32 12
170
171
172
173#define SRB_GET_32 13
174
175
176
177
178#define SRB_GET_VERSION 14
179
180
181
182
183#define SRB_FLUSH_BUFFER_Q 15
184
185
186
187#define SRB_GET_DMA_SPEEDS 16
188
189
190
191
192#define SRB_MODIFY_VC_RATE 17
193
194
195
196#define SRB_MODIFY_VC_FLAGS 18
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211#define SRB_RATE_SHIFT 16
212#define SRB_POOL_SHIFT (SRB_FLAGS_SHIFT+5)
213#define SRB_FLAGS_SHIFT 16
214
215#define SRB_STOP_TASKING 19
216#define SRB_START_TASKING 20
217#define SRB_SHUT_DOWN 21
218#define MAX_SRB 21
219
220#define SRB_COMPLETE 0xffffffff
221
222#define TX_FRAME 0x80000000
223
224
225#define NUM_OF_SRB 32
226
227
228#define MAX_RATE_BITS 6
229
230#define TX_UBR 0x0000
231#define TX_UBR_CAPPED 0x0008
232#define TX_ABR 0x0018
233#define TX_FRAME_NOTCAP 0x0000
234#define TX_FRAME_CAPPED 0x8000
235
236#define FP_155_RATE 0x24b1
237#define FP_25_RATE 0x1f9d
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252#define VERSION_NUMBER 0x01050025
253
254
255#define DMA_VALID 0xb728e149
256
257#define FLASH_BASE 0xa0c00000
258#define FLASH_SIZE 0x00020000
259#define BIA_BASE (FLASH_BASE+0x0001c000)
260#define BIA_ADDRESS ((void *)0xa0c1c000)
261#define PLX_BASE 0xe0000000
262
263typedef enum {
264 host_memory_test = 1,
265 read_adapter_memory,
266 write_adapter_memory,
267 adapter_start,
268 get_version_number,
269 interrupt_host,
270 flash_erase_sector,
271 adap_download_block = 0x20,
272 adap_erase_flash,
273 adap_run_in_iram,
274 adap_end_download
275} loader_command;
276
277#define BAD_COMMAND (-1)
278#define COMMAND_IN_PROGRESS 1
279#define COMMAND_PASSED_TEST 2
280#define COMMAND_FAILED_TEST 3
281#define COMMAND_READ_DATA_OK 4
282#define COMMAND_READ_BAD_ADDRESS 5
283#define COMMAND_WRITE_DATA_OK 6
284#define COMMAND_WRITE_BAD_ADDRESS 7
285#define COMMAND_WRITE_FLASH_FAILURE 8
286#define COMMAND_COMPLETE 9
287#define COMMAND_FLASH_ERASE_FAILURE 10
288#define COMMAND_WRITE_BAD_DATA 11
289
290
291
292#define GPINT_TST_FAILURE 0x00000001
293#define SUNI_DATA_PATTERN_FAILURE 0x00000002
294#define SUNI_DATA_BITS_FAILURE 0x00000004
295#define SUNI_UTOPIA_FAILURE 0x00000008
296#define SUNI_FIFO_FAILURE 0x00000010
297#define SRAM_FAILURE 0x00000020
298#define SELF_TEST_FAILURE 0x0000003f
299
300
301
302
303
304
305
306
307
308
309#define UNUSED_LOADER_MAILBOXES 6
310
311typedef struct {
312 u32 stuff[16];
313 union {
314 struct {
315 u32 result;
316 u32 ready;
317 u32 stuff[UNUSED_LOADER_MAILBOXES];
318 } loader;
319 struct {
320 u32 cmd_address;
321 u32 tx_address;
322 u32 rx_address[NUM_RX_POOLS];
323 u32 gen_counter;
324 u32 spare;
325 } adapter;
326 } mb;
327 u32 doorbell;
328 u32 interrupt;
329 u32 interrupt_control;
330 u32 reset_control;
331} amb_mem;
332
333
334#define AMB_RESET_BITS 0x40000000
335#define AMB_INTERRUPT_BITS 0x00000300
336#define AMB_DOORBELL_BITS 0x00030000
337
338
339
340#define MAX_COMMAND_DATA 13
341#define MAX_TRANSFER_DATA 11
342
343typedef struct {
344 __be32 address;
345 __be32 count;
346 __be32 data[MAX_TRANSFER_DATA];
347} transfer_block;
348
349typedef struct {
350 __be32 result;
351 __be32 command;
352 union {
353 transfer_block transfer;
354 __be32 version;
355 __be32 start;
356 __be32 data[MAX_COMMAND_DATA];
357 } payload;
358 __be32 valid;
359} loader_block;
360
361
362
363
364
365typedef struct {
366 union {
367 struct {
368 __be32 vc;
369 __be32 flags;
370 __be32 rate;
371 } open;
372 struct {
373 __be32 vc;
374 __be32 rate;
375 } modify_rate;
376 struct {
377 __be32 vc;
378 __be32 flags;
379 } modify_flags;
380 struct {
381 __be32 vc;
382 } close;
383 struct {
384 __be32 lower4;
385 __be32 upper2;
386 } bia;
387 struct {
388 __be32 address;
389 } suni;
390 struct {
391 __be32 major;
392 __be32 minor;
393 } version;
394 struct {
395 __be32 read;
396 __be32 write;
397 } speed;
398 struct {
399 __be32 flags;
400 } flush;
401 struct {
402 __be32 address;
403 __be32 data;
404 } memory;
405 __be32 par[3];
406 } args;
407 __be32 request;
408} command;
409
410
411
412
413
414
415
416
417
418typedef struct {
419 __be32 bytes;
420 __be32 address;
421} tx_frag;
422
423
424
425
426typedef struct {
427 u32 handle;
428 u16 vc;
429 u16 next_descriptor_length;
430 u32 next_descriptor;
431#ifdef AMB_NEW_MICROCODE
432 u8 cpcs_uu;
433 u8 cpi;
434 u16 pad;
435#endif
436} tx_frag_end;
437
438typedef struct {
439 tx_frag tx_frag;
440 tx_frag_end tx_frag_end;
441 struct sk_buff * skb;
442} tx_simple;
443
444#if 0
445typedef union {
446 tx_frag fragment;
447 tx_frag_end end_of_list;
448} tx_descr;
449#endif
450
451
452
453typedef struct {
454 __be16 vc;
455 __be16 tx_descr_length;
456 __be32 tx_descr_addr;
457} tx_in;
458
459
460
461typedef struct {
462 u32 handle;
463} tx_out;
464
465
466
467
468
469
470
471typedef struct {
472 u32 handle;
473 __be16 vc;
474 __be16 lec_id;
475 __be16 status;
476 __be16 length;
477} rx_out;
478
479
480
481typedef struct {
482 u32 handle;
483 __be32 host_address;
484} rx_in;
485
486
487
488
489
490
491
492
493
494
495
496typedef struct {
497 __be32 command_start;
498 __be32 command_end;
499 __be32 tx_start;
500 __be32 tx_end;
501 __be32 txcom_start;
502 __be32 txcom_end;
503 struct {
504 __be32 buffer_start;
505 __be32 buffer_end;
506 u32 buffer_q_get;
507 u32 buffer_q_end;
508 u32 buffer_aptr;
509 __be32 rx_start;
510 __be32 rx_end;
511 u32 rx_ptr;
512 __be32 buffer_size;
513 } rec_struct[NUM_RX_POOLS];
514#ifdef AMB_NEW_MICROCODE
515 u16 init_flags;
516 u16 talk_block_spare;
517#endif
518} adap_talk_block;
519
520
521
522
523
524
525typedef struct {
526 u8 racp_chcs;
527 u8 racp_uhcs;
528 u16 spare;
529 u32 racp_rcell;
530 u32 tacp_tcell;
531 u32 flags;
532 u32 dropped_cells;
533 u32 dropped_frames;
534} suni_stats;
535
536typedef enum {
537 dead
538} amb_flags;
539
540#define NEXTQ(current,start,limit) \
541 ( (current)+1 < (limit) ? (current)+1 : (start) )
542
543typedef struct {
544 command * start;
545 command * in;
546 command * out;
547 command * limit;
548} amb_cq_ptrs;
549
550typedef struct {
551 spinlock_t lock;
552 unsigned int pending;
553 unsigned int high;
554 unsigned int filled;
555 unsigned int maximum;
556 amb_cq_ptrs ptrs;
557} amb_cq;
558
559typedef struct {
560 spinlock_t lock;
561 unsigned int pending;
562 unsigned int high;
563 unsigned int filled;
564 unsigned int maximum;
565 struct {
566 tx_in * start;
567 tx_in * ptr;
568 tx_in * limit;
569 } in;
570 struct {
571 tx_out * start;
572 tx_out * ptr;
573 tx_out * limit;
574 } out;
575} amb_txq;
576
577typedef struct {
578 spinlock_t lock;
579 unsigned int pending;
580 unsigned int low;
581 unsigned int emptied;
582 unsigned int maximum;
583 struct {
584 rx_in * start;
585 rx_in * ptr;
586 rx_in * limit;
587 } in;
588 struct {
589 rx_out * start;
590 rx_out * ptr;
591 rx_out * limit;
592 } out;
593 unsigned int buffers_wanted;
594 unsigned int buffer_size;
595} amb_rxq;
596
597typedef struct {
598 unsigned long tx_ok;
599 struct {
600 unsigned long ok;
601 unsigned long error;
602 unsigned long badcrc;
603 unsigned long toolong;
604 unsigned long aborted;
605 unsigned long unused;
606 } rx;
607} amb_stats;
608
609
610
611typedef struct {
612 u8 tx_vc_bits:7;
613 u8 tx_present:1;
614} amb_tx_info;
615
616typedef struct {
617 unsigned char pool;
618} amb_rx_info;
619
620typedef struct {
621 amb_rx_info rx_info;
622 u16 tx_frame_bits;
623 unsigned int tx_rate;
624 unsigned int rx_rate;
625} amb_vcc;
626
627struct amb_dev {
628 u8 irq;
629 unsigned long flags;
630 u32 iobase;
631 u32 * membase;
632
633 amb_cq cq;
634 amb_txq txq;
635 amb_rxq rxq[NUM_RX_POOLS];
636
637 struct mutex vcc_sf;
638 amb_tx_info txer[NUM_VCS];
639 struct atm_vcc * rxer[NUM_VCS];
640 unsigned int tx_avail;
641 unsigned int rx_avail;
642
643 amb_stats stats;
644
645 struct atm_dev * atm_dev;
646 struct pci_dev * pci_dev;
647 struct timer_list housekeeping;
648};
649
650typedef struct amb_dev amb_dev;
651
652#define AMB_DEV(atm_dev) ((amb_dev *) (atm_dev)->dev_data)
653#define AMB_VCC(atm_vcc) ((amb_vcc *) (atm_vcc)->dev_data)
654
655
656
657typedef enum {
658 round_up,
659 round_down,
660 round_nearest
661} rounding;
662
663#endif
664