]> nv-tegra.nvidia Code Review - linux-2.6.git/blob - drivers/atm/fore200e.c
Merge commit 'origin/master'
[linux-2.6.git] / drivers / atm / fore200e.c
1 /*
2   A FORE Systems 200E-series driver for ATM on Linux.
3   Christophe Lizzi (lizzi@cnam.fr), October 1999-March 2003.
4
5   Based on the PCA-200E driver from Uwe Dannowski (Uwe.Dannowski@inf.tu-dresden.de).
6
7   This driver simultaneously supports PCA-200E and SBA-200E adapters
8   on i386, alpha (untested), powerpc, sparc and sparc64 architectures.
9
10   This program is free software; you can redistribute it and/or modify
11   it under the terms of the GNU General Public License as published by
12   the Free Software Foundation; either version 2 of the License, or
13   (at your option) any later version.
14
15   This program is distributed in the hope that it will be useful,
16   but WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18   GNU General Public License for more details.
19
20   You should have received a copy of the GNU General Public License
21   along with this program; if not, write to the Free Software
22   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 */
24
25
26 #include <linux/kernel.h>
27 #include <linux/slab.h>
28 #include <linux/init.h>
29 #include <linux/capability.h>
30 #include <linux/interrupt.h>
31 #include <linux/bitops.h>
32 #include <linux/pci.h>
33 #include <linux/module.h>
34 #include <linux/atmdev.h>
35 #include <linux/sonet.h>
36 #include <linux/atm_suni.h>
37 #include <linux/dma-mapping.h>
38 #include <linux/delay.h>
39 #include <linux/firmware.h>
40 #include <asm/io.h>
41 #include <asm/string.h>
42 #include <asm/page.h>
43 #include <asm/irq.h>
44 #include <asm/dma.h>
45 #include <asm/byteorder.h>
46 #include <asm/uaccess.h>
47 #include <asm/atomic.h>
48
49 #ifdef CONFIG_SBUS
50 #include <asm/idprom.h>
51 #include <asm/sbus.h>
52 #include <asm/openprom.h>
53 #include <asm/oplib.h>
54 #include <asm/pgtable.h>
55 #endif
56
57 #if defined(CONFIG_ATM_FORE200E_USE_TASKLET) /* defer interrupt work to a tasklet */
58 #define FORE200E_USE_TASKLET
59 #endif
60
61 #if 0 /* enable the debugging code of the buffer supply queues */
62 #define FORE200E_BSQ_DEBUG
63 #endif
64
65 #if 1 /* ensure correct handling of 52-byte AAL0 SDUs expected by atmdump-like apps */
66 #define FORE200E_52BYTE_AAL0_SDU
67 #endif
68
69 #include "fore200e.h"
70 #include "suni.h"
71
72 #define FORE200E_VERSION "0.3e"
73
74 #define FORE200E         "fore200e: "
75
76 #if 0 /* override .config */
77 #define CONFIG_ATM_FORE200E_DEBUG 1
78 #endif
79 #if defined(CONFIG_ATM_FORE200E_DEBUG) && (CONFIG_ATM_FORE200E_DEBUG > 0)
80 #define DPRINTK(level, format, args...)  do { if (CONFIG_ATM_FORE200E_DEBUG >= (level)) \
81                                                   printk(FORE200E format, ##args); } while (0)
82 #else
83 #define DPRINTK(level, format, args...)  do {} while (0)
84 #endif
85
86
87 #define FORE200E_ALIGN(addr, alignment) \
88         ((((unsigned long)(addr) + (alignment - 1)) & ~(alignment - 1)) - (unsigned long)(addr))
89
90 #define FORE200E_DMA_INDEX(dma_addr, type, index)  ((dma_addr) + (index) * sizeof(type))
91
92 #define FORE200E_INDEX(virt_addr, type, index)     (&((type *)(virt_addr))[ index ])
93
94 #define FORE200E_NEXT_ENTRY(index, modulo)         (index = ++(index) % (modulo))
95
96 #if 1
97 #define ASSERT(expr)     if (!(expr)) { \
98                              printk(FORE200E "assertion failed! %s[%d]: %s\n", \
99                                     __func__, __LINE__, #expr); \
100                              panic(FORE200E "%s", __func__); \
101                          }
102 #else
103 #define ASSERT(expr)     do {} while (0)
104 #endif
105
106
107 static const struct atmdev_ops   fore200e_ops;
108 static const struct fore200e_bus fore200e_bus[];
109
110 static LIST_HEAD(fore200e_boards);
111
112
113 MODULE_AUTHOR("Christophe Lizzi - credits to Uwe Dannowski and Heikki Vatiainen");
114 MODULE_DESCRIPTION("FORE Systems 200E-series ATM driver - version " FORE200E_VERSION);
115 MODULE_SUPPORTED_DEVICE("PCA-200E, SBA-200E");
116
117
118 static const int fore200e_rx_buf_nbr[ BUFFER_SCHEME_NBR ][ BUFFER_MAGN_NBR ] = {
119     { BUFFER_S1_NBR, BUFFER_L1_NBR },
120     { BUFFER_S2_NBR, BUFFER_L2_NBR }
121 };
122
123 static const int fore200e_rx_buf_size[ BUFFER_SCHEME_NBR ][ BUFFER_MAGN_NBR ] = {
124     { BUFFER_S1_SIZE, BUFFER_L1_SIZE },
125     { BUFFER_S2_SIZE, BUFFER_L2_SIZE }
126 };
127
128
129 #if defined(CONFIG_ATM_FORE200E_DEBUG) && (CONFIG_ATM_FORE200E_DEBUG > 0)
130 static const char* fore200e_traffic_class[] = { "NONE", "UBR", "CBR", "VBR", "ABR", "ANY" };
131 #endif
132
133
134 #if 0 /* currently unused */
135 static int 
136 fore200e_fore2atm_aal(enum fore200e_aal aal)
137 {
138     switch(aal) {
139     case FORE200E_AAL0:  return ATM_AAL0;
140     case FORE200E_AAL34: return ATM_AAL34;
141     case FORE200E_AAL5:  return ATM_AAL5;
142     }
143
144     return -EINVAL;
145 }
146 #endif
147
148
149 static enum fore200e_aal
150 fore200e_atm2fore_aal(int aal)
151 {
152     switch(aal) {
153     case ATM_AAL0:  return FORE200E_AAL0;
154     case ATM_AAL34: return FORE200E_AAL34;
155     case ATM_AAL1:
156     case ATM_AAL2:
157     case ATM_AAL5:  return FORE200E_AAL5;
158     }
159
160     return -EINVAL;
161 }
162
163
164 static char*
165 fore200e_irq_itoa(int irq)
166 {
167     static char str[8];
168     sprintf(str, "%d", irq);
169     return str;
170 }
171
172
173 /* allocate and align a chunk of memory intended to hold the data behing exchanged
174    between the driver and the adapter (using streaming DVMA) */
175
176 static int
177 fore200e_chunk_alloc(struct fore200e* fore200e, struct chunk* chunk, int size, int alignment, int direction)
178 {
179     unsigned long offset = 0;
180
181     if (alignment <= sizeof(int))
182         alignment = 0;
183
184     chunk->alloc_size = size + alignment;
185     chunk->align_size = size;
186     chunk->direction  = direction;
187
188     chunk->alloc_addr = kzalloc(chunk->alloc_size, GFP_KERNEL | GFP_DMA);
189     if (chunk->alloc_addr == NULL)
190         return -ENOMEM;
191
192     if (alignment > 0)
193         offset = FORE200E_ALIGN(chunk->alloc_addr, alignment); 
194     
195     chunk->align_addr = chunk->alloc_addr + offset;
196
197     chunk->dma_addr = fore200e->bus->dma_map(fore200e, chunk->align_addr, chunk->align_size, direction);
198     
199     return 0;
200 }
201
202
203 /* free a chunk of memory */
204
205 static void
206 fore200e_chunk_free(struct fore200e* fore200e, struct chunk* chunk)
207 {
208     fore200e->bus->dma_unmap(fore200e, chunk->dma_addr, chunk->dma_size, chunk->direction);
209
210     kfree(chunk->alloc_addr);
211 }
212
213
214 static void
215 fore200e_spin(int msecs)
216 {
217     unsigned long timeout = jiffies + msecs_to_jiffies(msecs);
218     while (time_before(jiffies, timeout));
219 }
220
221
222 static int
223 fore200e_poll(struct fore200e* fore200e, volatile u32* addr, u32 val, int msecs)
224 {
225     unsigned long timeout = jiffies + msecs_to_jiffies(msecs);
226     int           ok;
227
228     mb();
229     do {
230         if ((ok = (*addr == val)) || (*addr & STATUS_ERROR))
231             break;
232
233     } while (time_before(jiffies, timeout));
234
235 #if 1
236     if (!ok) {
237         printk(FORE200E "cmd polling failed, got status 0x%08x, expected 0x%08x\n",
238                *addr, val);
239     }
240 #endif
241
242     return ok;
243 }
244
245
246 static int
247 fore200e_io_poll(struct fore200e* fore200e, volatile u32 __iomem *addr, u32 val, int msecs)
248 {
249     unsigned long timeout = jiffies + msecs_to_jiffies(msecs);
250     int           ok;
251
252     do {
253         if ((ok = (fore200e->bus->read(addr) == val)))
254             break;
255
256     } while (time_before(jiffies, timeout));
257
258 #if 1
259     if (!ok) {
260         printk(FORE200E "I/O polling failed, got status 0x%08x, expected 0x%08x\n",
261                fore200e->bus->read(addr), val);
262     }
263 #endif
264
265     return ok;
266 }
267
268
269 static void
270 fore200e_free_rx_buf(struct fore200e* fore200e)
271 {
272     int scheme, magn, nbr;
273     struct buffer* buffer;
274
275     for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
276         for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
277
278             if ((buffer = fore200e->host_bsq[ scheme ][ magn ].buffer) != NULL) {
279
280                 for (nbr = 0; nbr < fore200e_rx_buf_nbr[ scheme ][ magn ]; nbr++) {
281
282                     struct chunk* data = &buffer[ nbr ].data;
283
284                     if (data->alloc_addr != NULL)
285                         fore200e_chunk_free(fore200e, data);
286                 }
287             }
288         }
289     }
290 }
291
292
293 static void
294 fore200e_uninit_bs_queue(struct fore200e* fore200e)
295 {
296     int scheme, magn;
297     
298     for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
299         for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
300
301             struct chunk* status    = &fore200e->host_bsq[ scheme ][ magn ].status;
302             struct chunk* rbd_block = &fore200e->host_bsq[ scheme ][ magn ].rbd_block;
303             
304             if (status->alloc_addr)
305                 fore200e->bus->dma_chunk_free(fore200e, status);
306             
307             if (rbd_block->alloc_addr)
308                 fore200e->bus->dma_chunk_free(fore200e, rbd_block);
309         }
310     }
311 }
312
313
314 static int
315 fore200e_reset(struct fore200e* fore200e, int diag)
316 {
317     int ok;
318
319     fore200e->cp_monitor = fore200e->virt_base + FORE200E_CP_MONITOR_OFFSET;
320     
321     fore200e->bus->write(BSTAT_COLD_START, &fore200e->cp_monitor->bstat);
322
323     fore200e->bus->reset(fore200e);
324
325     if (diag) {
326         ok = fore200e_io_poll(fore200e, &fore200e->cp_monitor->bstat, BSTAT_SELFTEST_OK, 1000);
327         if (ok == 0) {
328             
329             printk(FORE200E "device %s self-test failed\n", fore200e->name);
330             return -ENODEV;
331         }
332
333         printk(FORE200E "device %s self-test passed\n", fore200e->name);
334         
335         fore200e->state = FORE200E_STATE_RESET;
336     }
337
338     return 0;
339 }
340
341
342 static void
343 fore200e_shutdown(struct fore200e* fore200e)
344 {
345     printk(FORE200E "removing device %s at 0x%lx, IRQ %s\n",
346            fore200e->name, fore200e->phys_base, 
347            fore200e_irq_itoa(fore200e->irq));
348     
349     if (fore200e->state > FORE200E_STATE_RESET) {
350         /* first, reset the board to prevent further interrupts or data transfers */
351         fore200e_reset(fore200e, 0);
352     }
353     
354     /* then, release all allocated resources */
355     switch(fore200e->state) {
356
357     case FORE200E_STATE_COMPLETE:
358         kfree(fore200e->stats);
359
360     case FORE200E_STATE_IRQ:
361         free_irq(fore200e->irq, fore200e->atm_dev);
362
363     case FORE200E_STATE_ALLOC_BUF:
364         fore200e_free_rx_buf(fore200e);
365
366     case FORE200E_STATE_INIT_BSQ:
367         fore200e_uninit_bs_queue(fore200e);
368
369     case FORE200E_STATE_INIT_RXQ:
370         fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_rxq.status);
371         fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_rxq.rpd);
372
373     case FORE200E_STATE_INIT_TXQ:
374         fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_txq.status);
375         fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_txq.tpd);
376
377     case FORE200E_STATE_INIT_CMDQ:
378         fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_cmdq.status);
379
380     case FORE200E_STATE_INITIALIZE:
381         /* nothing to do for that state */
382
383     case FORE200E_STATE_START_FW:
384         /* nothing to do for that state */
385
386     case FORE200E_STATE_RESET:
387         /* nothing to do for that state */
388
389     case FORE200E_STATE_MAP:
390         fore200e->bus->unmap(fore200e);
391
392     case FORE200E_STATE_CONFIGURE:
393         /* nothing to do for that state */
394
395     case FORE200E_STATE_REGISTER:
396         /* XXX shouldn't we *start* by deregistering the device? */
397         atm_dev_deregister(fore200e->atm_dev);
398
399     case FORE200E_STATE_BLANK:
400         /* nothing to do for that state */
401         break;
402     }
403 }
404
405
406 #ifdef CONFIG_PCI
407
408 static u32 fore200e_pca_read(volatile u32 __iomem *addr)
409 {
410     /* on big-endian hosts, the board is configured to convert
411        the endianess of slave RAM accesses  */
412     return le32_to_cpu(readl(addr));
413 }
414
415
416 static void fore200e_pca_write(u32 val, volatile u32 __iomem *addr)
417 {
418     /* on big-endian hosts, the board is configured to convert
419        the endianess of slave RAM accesses  */
420     writel(cpu_to_le32(val), addr);
421 }
422
423
424 static u32
425 fore200e_pca_dma_map(struct fore200e* fore200e, void* virt_addr, int size, int direction)
426 {
427     u32 dma_addr = pci_map_single((struct pci_dev*)fore200e->bus_dev, virt_addr, size, direction);
428
429     DPRINTK(3, "PCI DVMA mapping: virt_addr = 0x%p, size = %d, direction = %d,  --> dma_addr = 0x%08x\n",
430             virt_addr, size, direction, dma_addr);
431     
432     return dma_addr;
433 }
434
435
436 static void
437 fore200e_pca_dma_unmap(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
438 {
439     DPRINTK(3, "PCI DVMA unmapping: dma_addr = 0x%08x, size = %d, direction = %d\n",
440             dma_addr, size, direction);
441
442     pci_unmap_single((struct pci_dev*)fore200e->bus_dev, dma_addr, size, direction);
443 }
444
445
446 static void
447 fore200e_pca_dma_sync_for_cpu(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
448 {
449     DPRINTK(3, "PCI DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction);
450
451     pci_dma_sync_single_for_cpu((struct pci_dev*)fore200e->bus_dev, dma_addr, size, direction);
452 }
453
454 static void
455 fore200e_pca_dma_sync_for_device(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
456 {
457     DPRINTK(3, "PCI DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction);
458
459     pci_dma_sync_single_for_device((struct pci_dev*)fore200e->bus_dev, dma_addr, size, direction);
460 }
461
462
463 /* allocate a DMA consistent chunk of memory intended to act as a communication mechanism
464    (to hold descriptors, status, queues, etc.) shared by the driver and the adapter */
465
466 static int
467 fore200e_pca_dma_chunk_alloc(struct fore200e* fore200e, struct chunk* chunk,
468                              int size, int nbr, int alignment)
469 {
470     /* returned chunks are page-aligned */
471     chunk->alloc_size = size * nbr;
472     chunk->alloc_addr = pci_alloc_consistent((struct pci_dev*)fore200e->bus_dev,
473                                              chunk->alloc_size,
474                                              &chunk->dma_addr);
475     
476     if ((chunk->alloc_addr == NULL) || (chunk->dma_addr == 0))
477         return -ENOMEM;
478
479     chunk->align_addr = chunk->alloc_addr;
480     
481     return 0;
482 }
483
484
485 /* free a DMA consistent chunk of memory */
486
487 static void
488 fore200e_pca_dma_chunk_free(struct fore200e* fore200e, struct chunk* chunk)
489 {
490     pci_free_consistent((struct pci_dev*)fore200e->bus_dev,
491                         chunk->alloc_size,
492                         chunk->alloc_addr,
493                         chunk->dma_addr);
494 }
495
496
497 static int
498 fore200e_pca_irq_check(struct fore200e* fore200e)
499 {
500     /* this is a 1 bit register */
501     int irq_posted = readl(fore200e->regs.pca.psr);
502
503 #if defined(CONFIG_ATM_FORE200E_DEBUG) && (CONFIG_ATM_FORE200E_DEBUG == 2)
504     if (irq_posted && (readl(fore200e->regs.pca.hcr) & PCA200E_HCR_OUTFULL)) {
505         DPRINTK(2,"FIFO OUT full, device %d\n", fore200e->atm_dev->number);
506     }
507 #endif
508
509     return irq_posted;
510 }
511
512
513 static void
514 fore200e_pca_irq_ack(struct fore200e* fore200e)
515 {
516     writel(PCA200E_HCR_CLRINTR, fore200e->regs.pca.hcr);
517 }
518
519
520 static void
521 fore200e_pca_reset(struct fore200e* fore200e)
522 {
523     writel(PCA200E_HCR_RESET, fore200e->regs.pca.hcr);
524     fore200e_spin(10);
525     writel(0, fore200e->regs.pca.hcr);
526 }
527
528
529 static int __devinit
530 fore200e_pca_map(struct fore200e* fore200e)
531 {
532     DPRINTK(2, "device %s being mapped in memory\n", fore200e->name);
533
534     fore200e->virt_base = ioremap(fore200e->phys_base, PCA200E_IOSPACE_LENGTH);
535     
536     if (fore200e->virt_base == NULL) {
537         printk(FORE200E "can't map device %s\n", fore200e->name);
538         return -EFAULT;
539     }
540
541     DPRINTK(1, "device %s mapped to 0x%p\n", fore200e->name, fore200e->virt_base);
542
543     /* gain access to the PCA specific registers  */
544     fore200e->regs.pca.hcr = fore200e->virt_base + PCA200E_HCR_OFFSET;
545     fore200e->regs.pca.imr = fore200e->virt_base + PCA200E_IMR_OFFSET;
546     fore200e->regs.pca.psr = fore200e->virt_base + PCA200E_PSR_OFFSET;
547
548     fore200e->state = FORE200E_STATE_MAP;
549     return 0;
550 }
551
552
553 static void
554 fore200e_pca_unmap(struct fore200e* fore200e)
555 {
556     DPRINTK(2, "device %s being unmapped from memory\n", fore200e->name);
557
558     if (fore200e->virt_base != NULL)
559         iounmap(fore200e->virt_base);
560 }
561
562
563 static int __devinit
564 fore200e_pca_configure(struct fore200e* fore200e)
565 {
566     struct pci_dev* pci_dev = (struct pci_dev*)fore200e->bus_dev;
567     u8              master_ctrl, latency;
568
569     DPRINTK(2, "device %s being configured\n", fore200e->name);
570
571     if ((pci_dev->irq == 0) || (pci_dev->irq == 0xFF)) {
572         printk(FORE200E "incorrect IRQ setting - misconfigured PCI-PCI bridge?\n");
573         return -EIO;
574     }
575
576     pci_read_config_byte(pci_dev, PCA200E_PCI_MASTER_CTRL, &master_ctrl);
577
578     master_ctrl = master_ctrl
579 #if defined(__BIG_ENDIAN)
580         /* request the PCA board to convert the endianess of slave RAM accesses */
581         | PCA200E_CTRL_CONVERT_ENDIAN
582 #endif
583 #if 0
584         | PCA200E_CTRL_DIS_CACHE_RD
585         | PCA200E_CTRL_DIS_WRT_INVAL
586         | PCA200E_CTRL_ENA_CONT_REQ_MODE
587         | PCA200E_CTRL_2_CACHE_WRT_INVAL
588 #endif
589         | PCA200E_CTRL_LARGE_PCI_BURSTS;
590     
591     pci_write_config_byte(pci_dev, PCA200E_PCI_MASTER_CTRL, master_ctrl);
592
593     /* raise latency from 32 (default) to 192, as this seems to prevent NIC
594        lockups (under heavy rx loads) due to continuous 'FIFO OUT full' condition.
595        this may impact the performances of other PCI devices on the same bus, though */
596     latency = 192;
597     pci_write_config_byte(pci_dev, PCI_LATENCY_TIMER, latency);
598
599     fore200e->state = FORE200E_STATE_CONFIGURE;
600     return 0;
601 }
602
603
604 static int __init
605 fore200e_pca_prom_read(struct fore200e* fore200e, struct prom_data* prom)
606 {
607     struct host_cmdq*       cmdq  = &fore200e->host_cmdq;
608     struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
609     struct prom_opcode      opcode;
610     int                     ok;
611     u32                     prom_dma;
612
613     FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
614
615     opcode.opcode = OPCODE_GET_PROM;
616     opcode.pad    = 0;
617
618     prom_dma = fore200e->bus->dma_map(fore200e, prom, sizeof(struct prom_data), DMA_FROM_DEVICE);
619
620     fore200e->bus->write(prom_dma, &entry->cp_entry->cmd.prom_block.prom_haddr);
621     
622     *entry->status = STATUS_PENDING;
623
624     fore200e->bus->write(*(u32*)&opcode, (u32 __iomem *)&entry->cp_entry->cmd.prom_block.opcode);
625
626     ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
627
628     *entry->status = STATUS_FREE;
629
630     fore200e->bus->dma_unmap(fore200e, prom_dma, sizeof(struct prom_data), DMA_FROM_DEVICE);
631
632     if (ok == 0) {
633         printk(FORE200E "unable to get PROM data from device %s\n", fore200e->name);
634         return -EIO;
635     }
636
637 #if defined(__BIG_ENDIAN)
638     
639 #define swap_here(addr) (*((u32*)(addr)) = swab32( *((u32*)(addr)) ))
640
641     /* MAC address is stored as little-endian */
642     swap_here(&prom->mac_addr[0]);
643     swap_here(&prom->mac_addr[4]);
644 #endif
645     
646     return 0;
647 }
648
649
650 static int
651 fore200e_pca_proc_read(struct fore200e* fore200e, char *page)
652 {
653     struct pci_dev* pci_dev = (struct pci_dev*)fore200e->bus_dev;
654
655     return sprintf(page, "   PCI bus/slot/function:\t%d/%d/%d\n",
656                    pci_dev->bus->number, PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn));
657 }
658
659 #endif /* CONFIG_PCI */
660
661
662 #ifdef CONFIG_SBUS
663
664 static u32
665 fore200e_sba_read(volatile u32 __iomem *addr)
666 {
667     return sbus_readl(addr);
668 }
669
670
671 static void
672 fore200e_sba_write(u32 val, volatile u32 __iomem *addr)
673 {
674     sbus_writel(val, addr);
675 }
676
677
678 static u32
679 fore200e_sba_dma_map(struct fore200e* fore200e, void* virt_addr, int size, int direction)
680 {
681     u32 dma_addr = sbus_map_single((struct sbus_dev*)fore200e->bus_dev, virt_addr, size, direction);
682
683     DPRINTK(3, "SBUS DVMA mapping: virt_addr = 0x%p, size = %d, direction = %d --> dma_addr = 0x%08x\n",
684             virt_addr, size, direction, dma_addr);
685     
686     return dma_addr;
687 }
688
689
690 static void
691 fore200e_sba_dma_unmap(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
692 {
693     DPRINTK(3, "SBUS DVMA unmapping: dma_addr = 0x%08x, size = %d, direction = %d,\n",
694             dma_addr, size, direction);
695
696     sbus_unmap_single((struct sbus_dev*)fore200e->bus_dev, dma_addr, size, direction);
697 }
698
699
700 static void
701 fore200e_sba_dma_sync_for_cpu(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
702 {
703     DPRINTK(3, "SBUS DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction);
704     
705     sbus_dma_sync_single_for_cpu((struct sbus_dev*)fore200e->bus_dev, dma_addr, size, direction);
706 }
707
708 static void
709 fore200e_sba_dma_sync_for_device(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
710 {
711     DPRINTK(3, "SBUS DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction);
712
713     sbus_dma_sync_single_for_device((struct sbus_dev*)fore200e->bus_dev, dma_addr, size, direction);
714 }
715
716
717 /* allocate a DVMA consistent chunk of memory intended to act as a communication mechanism
718    (to hold descriptors, status, queues, etc.) shared by the driver and the adapter */
719
720 static int
721 fore200e_sba_dma_chunk_alloc(struct fore200e* fore200e, struct chunk* chunk,
722                              int size, int nbr, int alignment)
723 {
724     chunk->alloc_size = chunk->align_size = size * nbr;
725
726     /* returned chunks are page-aligned */
727     chunk->alloc_addr = sbus_alloc_consistent((struct sbus_dev*)fore200e->bus_dev,
728                                               chunk->alloc_size,
729                                               &chunk->dma_addr);
730
731     if ((chunk->alloc_addr == NULL) || (chunk->dma_addr == 0))
732         return -ENOMEM;
733
734     chunk->align_addr = chunk->alloc_addr;
735     
736     return 0;
737 }
738
739
740 /* free a DVMA consistent chunk of memory */
741
742 static void
743 fore200e_sba_dma_chunk_free(struct fore200e* fore200e, struct chunk* chunk)
744 {
745     sbus_free_consistent((struct sbus_dev*)fore200e->bus_dev,
746                          chunk->alloc_size,
747                          chunk->alloc_addr,
748                          chunk->dma_addr);
749 }
750
751
752 static void
753 fore200e_sba_irq_enable(struct fore200e* fore200e)
754 {
755     u32 hcr = fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_STICKY;
756     fore200e->bus->write(hcr | SBA200E_HCR_INTR_ENA, fore200e->regs.sba.hcr);
757 }
758
759
760 static int
761 fore200e_sba_irq_check(struct fore200e* fore200e)
762 {
763     return fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_INTR_REQ;
764 }
765
766
767 static void
768 fore200e_sba_irq_ack(struct fore200e* fore200e)
769 {
770     u32 hcr = fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_STICKY;
771     fore200e->bus->write(hcr | SBA200E_HCR_INTR_CLR, fore200e->regs.sba.hcr);
772 }
773
774
775 static void
776 fore200e_sba_reset(struct fore200e* fore200e)
777 {
778     fore200e->bus->write(SBA200E_HCR_RESET, fore200e->regs.sba.hcr);
779     fore200e_spin(10);
780     fore200e->bus->write(0, fore200e->regs.sba.hcr);
781 }
782
783
784 static int __init
785 fore200e_sba_map(struct fore200e* fore200e)
786 {
787     struct sbus_dev* sbus_dev = (struct sbus_dev*)fore200e->bus_dev;
788     unsigned int bursts;
789
790     /* gain access to the SBA specific registers  */
791     fore200e->regs.sba.hcr = sbus_ioremap(&sbus_dev->resource[0], 0, SBA200E_HCR_LENGTH, "SBA HCR");
792     fore200e->regs.sba.bsr = sbus_ioremap(&sbus_dev->resource[1], 0, SBA200E_BSR_LENGTH, "SBA BSR");
793     fore200e->regs.sba.isr = sbus_ioremap(&sbus_dev->resource[2], 0, SBA200E_ISR_LENGTH, "SBA ISR");
794     fore200e->virt_base    = sbus_ioremap(&sbus_dev->resource[3], 0, SBA200E_RAM_LENGTH, "SBA RAM");
795
796     if (fore200e->virt_base == NULL) {
797         printk(FORE200E "unable to map RAM of device %s\n", fore200e->name);
798         return -EFAULT;
799     }
800
801     DPRINTK(1, "device %s mapped to 0x%p\n", fore200e->name, fore200e->virt_base);
802     
803     fore200e->bus->write(0x02, fore200e->regs.sba.isr); /* XXX hardwired interrupt level */
804
805     /* get the supported DVMA burst sizes */
806     bursts = prom_getintdefault(sbus_dev->bus->prom_node, "burst-sizes", 0x00);
807
808     if (sbus_can_dma_64bit(sbus_dev))
809         sbus_set_sbus64(sbus_dev, bursts);
810
811     fore200e->state = FORE200E_STATE_MAP;
812     return 0;
813 }
814
815
816 static void
817 fore200e_sba_unmap(struct fore200e* fore200e)
818 {
819     sbus_iounmap(fore200e->regs.sba.hcr, SBA200E_HCR_LENGTH);
820     sbus_iounmap(fore200e->regs.sba.bsr, SBA200E_BSR_LENGTH);
821     sbus_iounmap(fore200e->regs.sba.isr, SBA200E_ISR_LENGTH);
822     sbus_iounmap(fore200e->virt_base,    SBA200E_RAM_LENGTH);
823 }
824
825
826 static int __init
827 fore200e_sba_configure(struct fore200e* fore200e)
828 {
829     fore200e->state = FORE200E_STATE_CONFIGURE;
830     return 0;
831 }
832
833
834 static struct fore200e* __init
835 fore200e_sba_detect(const struct fore200e_bus* bus, int index)
836 {
837     struct fore200e*          fore200e;
838     struct sbus_bus* sbus_bus;
839     struct sbus_dev* sbus_dev = NULL;
840     
841     unsigned int     count = 0;
842     
843     for_each_sbus (sbus_bus) {
844         for_each_sbusdev (sbus_dev, sbus_bus) {
845             if (strcmp(sbus_dev->prom_name, SBA200E_PROM_NAME) == 0) {
846                 if (count >= index)
847                     goto found;
848                 count++;
849             }
850         }
851     }
852     return NULL;
853     
854   found:
855     if (sbus_dev->num_registers != 4) {
856         printk(FORE200E "this %s device has %d instead of 4 registers\n",
857                bus->model_name, sbus_dev->num_registers);
858         return NULL;
859     }
860
861     fore200e = kzalloc(sizeof(struct fore200e), GFP_KERNEL);
862     if (fore200e == NULL)
863         return NULL;
864
865     fore200e->bus     = bus;
866     fore200e->bus_dev = sbus_dev;
867     fore200e->irq     = sbus_dev->irqs[ 0 ];
868
869     fore200e->phys_base = (unsigned long)sbus_dev;
870
871     sprintf(fore200e->name, "%s-%d", bus->model_name, index - 1);
872     
873     return fore200e;
874 }
875
876
877 static int __init
878 fore200e_sba_prom_read(struct fore200e* fore200e, struct prom_data* prom)
879 {
880     struct sbus_dev* sbus_dev = (struct sbus_dev*) fore200e->bus_dev;
881     int                       len;
882
883     len = prom_getproperty(sbus_dev->prom_node, "macaddrlo2", &prom->mac_addr[ 4 ], 4);
884     if (len < 0)
885         return -EBUSY;
886
887     len = prom_getproperty(sbus_dev->prom_node, "macaddrhi4", &prom->mac_addr[ 2 ], 4);
888     if (len < 0)
889         return -EBUSY;
890     
891     prom_getproperty(sbus_dev->prom_node, "serialnumber",
892                      (char*)&prom->serial_number, sizeof(prom->serial_number));
893     
894     prom_getproperty(sbus_dev->prom_node, "promversion",
895                      (char*)&prom->hw_revision, sizeof(prom->hw_revision));
896     
897     return 0;
898 }
899
900
901 static int
902 fore200e_sba_proc_read(struct fore200e* fore200e, char *page)
903 {
904     struct sbus_dev* sbus_dev = (struct sbus_dev*)fore200e->bus_dev;
905
906     return sprintf(page, "   SBUS slot/device:\t\t%d/'%s'\n", sbus_dev->slot, sbus_dev->prom_name);
907 }
908 #endif /* CONFIG_SBUS */
909
910
911 static void
912 fore200e_tx_irq(struct fore200e* fore200e)
913 {
914     struct host_txq*        txq = &fore200e->host_txq;
915     struct host_txq_entry*  entry;
916     struct atm_vcc*         vcc;
917     struct fore200e_vc_map* vc_map;
918
919     if (fore200e->host_txq.txing == 0)
920         return;
921
922     for (;;) {
923         
924         entry = &txq->host_entry[ txq->tail ];
925
926         if ((*entry->status & STATUS_COMPLETE) == 0) {
927             break;
928         }
929
930         DPRINTK(3, "TX COMPLETED: entry = %p [tail = %d], vc_map = %p, skb = %p\n", 
931                 entry, txq->tail, entry->vc_map, entry->skb);
932
933         /* free copy of misaligned data */
934         kfree(entry->data);
935         
936         /* remove DMA mapping */
937         fore200e->bus->dma_unmap(fore200e, entry->tpd->tsd[ 0 ].buffer, entry->tpd->tsd[ 0 ].length,
938                                  DMA_TO_DEVICE);
939
940         vc_map = entry->vc_map;
941
942         /* vcc closed since the time the entry was submitted for tx? */
943         if ((vc_map->vcc == NULL) ||
944             (test_bit(ATM_VF_READY, &vc_map->vcc->flags) == 0)) {
945
946             DPRINTK(1, "no ready vcc found for PDU sent on device %d\n",
947                     fore200e->atm_dev->number);
948
949             dev_kfree_skb_any(entry->skb);
950         }
951         else {
952             ASSERT(vc_map->vcc);
953
954             /* vcc closed then immediately re-opened? */
955             if (vc_map->incarn != entry->incarn) {
956
957                 /* when a vcc is closed, some PDUs may be still pending in the tx queue.
958                    if the same vcc is immediately re-opened, those pending PDUs must
959                    not be popped after the completion of their emission, as they refer
960                    to the prior incarnation of that vcc. otherwise, sk_atm(vcc)->sk_wmem_alloc
961                    would be decremented by the size of the (unrelated) skb, possibly
962                    leading to a negative sk->sk_wmem_alloc count, ultimately freezing the vcc.
963                    we thus bind the tx entry to the current incarnation of the vcc
964                    when the entry is submitted for tx. When the tx later completes,
965                    if the incarnation number of the tx entry does not match the one
966                    of the vcc, then this implies that the vcc has been closed then re-opened.
967                    we thus just drop the skb here. */
968
969                 DPRINTK(1, "vcc closed-then-re-opened; dropping PDU sent on device %d\n",
970                         fore200e->atm_dev->number);
971
972                 dev_kfree_skb_any(entry->skb);
973             }
974             else {
975                 vcc = vc_map->vcc;
976                 ASSERT(vcc);
977
978                 /* notify tx completion */
979                 if (vcc->pop) {
980                     vcc->pop(vcc, entry->skb);
981                 }
982                 else {
983                     dev_kfree_skb_any(entry->skb);
984                 }
985 #if 1
986                 /* race fixed by the above incarnation mechanism, but... */
987                 if (atomic_read(&sk_atm(vcc)->sk_wmem_alloc) < 0) {
988                     atomic_set(&sk_atm(vcc)->sk_wmem_alloc, 0);
989                 }
990 #endif
991                 /* check error condition */
992                 if (*entry->status & STATUS_ERROR)
993                     atomic_inc(&vcc->stats->tx_err);
994                 else
995                     atomic_inc(&vcc->stats->tx);
996             }
997         }
998
999         *entry->status = STATUS_FREE;
1000
1001         fore200e->host_txq.txing--;
1002
1003         FORE200E_NEXT_ENTRY(txq->tail, QUEUE_SIZE_TX);
1004     }
1005 }
1006
1007
1008 #ifdef FORE200E_BSQ_DEBUG
1009 int bsq_audit(int where, struct host_bsq* bsq, int scheme, int magn)
1010 {
1011     struct buffer* buffer;
1012     int count = 0;
1013
1014     buffer = bsq->freebuf;
1015     while (buffer) {
1016
1017         if (buffer->supplied) {
1018             printk(FORE200E "bsq_audit(%d): queue %d.%d, buffer %ld supplied but in free list!\n",
1019                    where, scheme, magn, buffer->index);
1020         }
1021
1022         if (buffer->magn != magn) {
1023             printk(FORE200E "bsq_audit(%d): queue %d.%d, buffer %ld, unexpected magn = %d\n",
1024                    where, scheme, magn, buffer->index, buffer->magn);
1025         }
1026
1027         if (buffer->scheme != scheme) {
1028             printk(FORE200E "bsq_audit(%d): queue %d.%d, buffer %ld, unexpected scheme = %d\n",
1029                    where, scheme, magn, buffer->index, buffer->scheme);
1030         }
1031
1032         if ((buffer->index < 0) || (buffer->index >= fore200e_rx_buf_nbr[ scheme ][ magn ])) {
1033             printk(FORE200E "bsq_audit(%d): queue %d.%d, out of range buffer index = %ld !\n",
1034                    where, scheme, magn, buffer->index);
1035         }
1036
1037         count++;
1038         buffer = buffer->next;
1039     }
1040
1041     if (count != bsq->freebuf_count) {
1042         printk(FORE200E "bsq_audit(%d): queue %d.%d, %d bufs in free list, but freebuf_count = %d\n",
1043                where, scheme, magn, count, bsq->freebuf_count);
1044     }
1045     return 0;
1046 }
1047 #endif
1048
1049
1050 static void
1051 fore200e_supply(struct fore200e* fore200e)
1052 {
1053     int  scheme, magn, i;
1054
1055     struct host_bsq*       bsq;
1056     struct host_bsq_entry* entry;
1057     struct buffer*         buffer;
1058
1059     for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
1060         for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
1061
1062             bsq = &fore200e->host_bsq[ scheme ][ magn ];
1063
1064 #ifdef FORE200E_BSQ_DEBUG
1065             bsq_audit(1, bsq, scheme, magn);
1066 #endif
1067             while (bsq->freebuf_count >= RBD_BLK_SIZE) {
1068
1069                 DPRINTK(2, "supplying %d rx buffers to queue %d / %d, freebuf_count = %d\n",
1070                         RBD_BLK_SIZE, scheme, magn, bsq->freebuf_count);
1071
1072                 entry = &bsq->host_entry[ bsq->head ];
1073
1074                 for (i = 0; i < RBD_BLK_SIZE; i++) {
1075
1076                     /* take the first buffer in the free buffer list */
1077                     buffer = bsq->freebuf;
1078                     if (!buffer) {
1079                         printk(FORE200E "no more free bufs in queue %d.%d, but freebuf_count = %d\n",
1080                                scheme, magn, bsq->freebuf_count);
1081                         return;
1082                     }
1083                     bsq->freebuf = buffer->next;
1084                     
1085 #ifdef FORE200E_BSQ_DEBUG
1086                     if (buffer->supplied)
1087                         printk(FORE200E "queue %d.%d, buffer %lu already supplied\n",
1088                                scheme, magn, buffer->index);
1089                     buffer->supplied = 1;
1090 #endif
1091                     entry->rbd_block->rbd[ i ].buffer_haddr = buffer->data.dma_addr;
1092                     entry->rbd_block->rbd[ i ].handle       = FORE200E_BUF2HDL(buffer);
1093                 }
1094
1095                 FORE200E_NEXT_ENTRY(bsq->head, QUEUE_SIZE_BS);
1096
1097                 /* decrease accordingly the number of free rx buffers */
1098                 bsq->freebuf_count -= RBD_BLK_SIZE;
1099
1100                 *entry->status = STATUS_PENDING;
1101                 fore200e->bus->write(entry->rbd_block_dma, &entry->cp_entry->rbd_block_haddr);
1102             }
1103         }
1104     }
1105 }
1106
1107
1108 static int
1109 fore200e_push_rpd(struct fore200e* fore200e, struct atm_vcc* vcc, struct rpd* rpd)
1110 {
1111     struct sk_buff*      skb;
1112     struct buffer*       buffer;
1113     struct fore200e_vcc* fore200e_vcc;
1114     int                  i, pdu_len = 0;
1115 #ifdef FORE200E_52BYTE_AAL0_SDU
1116     u32                  cell_header = 0;
1117 #endif
1118
1119     ASSERT(vcc);
1120     
1121     fore200e_vcc = FORE200E_VCC(vcc);
1122     ASSERT(fore200e_vcc);
1123
1124 #ifdef FORE200E_52BYTE_AAL0_SDU
1125     if ((vcc->qos.aal == ATM_AAL0) && (vcc->qos.rxtp.max_sdu == ATM_AAL0_SDU)) {
1126
1127         cell_header = (rpd->atm_header.gfc << ATM_HDR_GFC_SHIFT) |
1128                       (rpd->atm_header.vpi << ATM_HDR_VPI_SHIFT) |
1129                       (rpd->atm_header.vci << ATM_HDR_VCI_SHIFT) |
1130                       (rpd->atm_header.plt << ATM_HDR_PTI_SHIFT) | 
1131                        rpd->atm_header.clp;
1132         pdu_len = 4;
1133     }
1134 #endif
1135     
1136     /* compute total PDU length */
1137     for (i = 0; i < rpd->nseg; i++)
1138         pdu_len += rpd->rsd[ i ].length;
1139     
1140     skb = alloc_skb(pdu_len, GFP_ATOMIC);
1141     if (skb == NULL) {
1142         DPRINTK(2, "unable to alloc new skb, rx PDU length = %d\n", pdu_len);
1143
1144         atomic_inc(&vcc->stats->rx_drop);
1145         return -ENOMEM;
1146     } 
1147
1148     __net_timestamp(skb);
1149     
1150 #ifdef FORE200E_52BYTE_AAL0_SDU
1151     if (cell_header) {
1152         *((u32*)skb_put(skb, 4)) = cell_header;
1153     }
1154 #endif
1155
1156     /* reassemble segments */
1157     for (i = 0; i < rpd->nseg; i++) {
1158         
1159         /* rebuild rx buffer address from rsd handle */
1160         buffer = FORE200E_HDL2BUF(rpd->rsd[ i ].handle);
1161         
1162         /* Make device DMA transfer visible to CPU.  */
1163         fore200e->bus->dma_sync_for_cpu(fore200e, buffer->data.dma_addr, rpd->rsd[ i ].length, DMA_FROM_DEVICE);
1164         
1165         memcpy(skb_put(skb, rpd->rsd[ i ].length), buffer->data.align_addr, rpd->rsd[ i ].length);
1166
1167         /* Now let the device get at it again.  */
1168         fore200e->bus->dma_sync_for_device(fore200e, buffer->data.dma_addr, rpd->rsd[ i ].length, DMA_FROM_DEVICE);
1169     }
1170
1171     DPRINTK(3, "rx skb: len = %d, truesize = %d\n", skb->len, skb->truesize);
1172     
1173     if (pdu_len < fore200e_vcc->rx_min_pdu)
1174         fore200e_vcc->rx_min_pdu = pdu_len;
1175     if (pdu_len > fore200e_vcc->rx_max_pdu)
1176         fore200e_vcc->rx_max_pdu = pdu_len;
1177     fore200e_vcc->rx_pdu++;
1178
1179     /* push PDU */
1180     if (atm_charge(vcc, skb->truesize) == 0) {
1181
1182         DPRINTK(2, "receive buffers saturated for %d.%d.%d - PDU dropped\n",
1183                 vcc->itf, vcc->vpi, vcc->vci);
1184
1185         dev_kfree_skb_any(skb);
1186
1187         atomic_inc(&vcc->stats->rx_drop);
1188         return -ENOMEM;
1189     }
1190
1191     ASSERT(atomic_read(&sk_atm(vcc)->sk_wmem_alloc) >= 0);
1192
1193     vcc->push(vcc, skb);
1194     atomic_inc(&vcc->stats->rx);
1195
1196     ASSERT(atomic_read(&sk_atm(vcc)->sk_wmem_alloc) >= 0);
1197
1198     return 0;
1199 }
1200
1201
1202 static void
1203 fore200e_collect_rpd(struct fore200e* fore200e, struct rpd* rpd)
1204 {
1205     struct host_bsq* bsq;
1206     struct buffer*   buffer;
1207     int              i;
1208     
1209     for (i = 0; i < rpd->nseg; i++) {
1210
1211         /* rebuild rx buffer address from rsd handle */
1212         buffer = FORE200E_HDL2BUF(rpd->rsd[ i ].handle);
1213
1214         bsq = &fore200e->host_bsq[ buffer->scheme ][ buffer->magn ];
1215
1216 #ifdef FORE200E_BSQ_DEBUG
1217         bsq_audit(2, bsq, buffer->scheme, buffer->magn);
1218
1219         if (buffer->supplied == 0)
1220             printk(FORE200E "queue %d.%d, buffer %ld was not supplied\n",
1221                    buffer->scheme, buffer->magn, buffer->index);
1222         buffer->supplied = 0;
1223 #endif
1224
1225         /* re-insert the buffer into the free buffer list */
1226         buffer->next = bsq->freebuf;
1227         bsq->freebuf = buffer;
1228
1229         /* then increment the number of free rx buffers */
1230         bsq->freebuf_count++;
1231     }
1232 }
1233
1234
1235 static void
1236 fore200e_rx_irq(struct fore200e* fore200e)
1237 {
1238     struct host_rxq*        rxq = &fore200e->host_rxq;
1239     struct host_rxq_entry*  entry;
1240     struct atm_vcc*         vcc;
1241     struct fore200e_vc_map* vc_map;
1242
1243     for (;;) {
1244         
1245         entry = &rxq->host_entry[ rxq->head ];
1246
1247         /* no more received PDUs */
1248         if ((*entry->status & STATUS_COMPLETE) == 0)
1249             break;
1250
1251         vc_map = FORE200E_VC_MAP(fore200e, entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci);
1252
1253         if ((vc_map->vcc == NULL) ||
1254             (test_bit(ATM_VF_READY, &vc_map->vcc->flags) == 0)) {
1255
1256             DPRINTK(1, "no ready VC found for PDU received on %d.%d.%d\n",
1257                     fore200e->atm_dev->number,
1258                     entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci);
1259         }
1260         else {
1261             vcc = vc_map->vcc;
1262             ASSERT(vcc);
1263
1264             if ((*entry->status & STATUS_ERROR) == 0) {
1265
1266                 fore200e_push_rpd(fore200e, vcc, entry->rpd);
1267             }
1268             else {
1269                 DPRINTK(2, "damaged PDU on %d.%d.%d\n",
1270                         fore200e->atm_dev->number,
1271                         entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci);
1272                 atomic_inc(&vcc->stats->rx_err);
1273             }
1274         }
1275
1276         FORE200E_NEXT_ENTRY(rxq->head, QUEUE_SIZE_RX);
1277
1278         fore200e_collect_rpd(fore200e, entry->rpd);
1279
1280         /* rewrite the rpd address to ack the received PDU */
1281         fore200e->bus->write(entry->rpd_dma, &entry->cp_entry->rpd_haddr);
1282         *entry->status = STATUS_FREE;
1283
1284         fore200e_supply(fore200e);
1285     }
1286 }
1287
1288
1289 #ifndef FORE200E_USE_TASKLET
1290 static void
1291 fore200e_irq(struct fore200e* fore200e)
1292 {
1293     unsigned long flags;
1294
1295     spin_lock_irqsave(&fore200e->q_lock, flags);
1296     fore200e_rx_irq(fore200e);
1297     spin_unlock_irqrestore(&fore200e->q_lock, flags);
1298
1299     spin_lock_irqsave(&fore200e->q_lock, flags);
1300     fore200e_tx_irq(fore200e);
1301     spin_unlock_irqrestore(&fore200e->q_lock, flags);
1302 }
1303 #endif
1304
1305
1306 static irqreturn_t
1307 fore200e_interrupt(int irq, void* dev)
1308 {
1309     struct fore200e* fore200e = FORE200E_DEV((struct atm_dev*)dev);
1310
1311     if (fore200e->bus->irq_check(fore200e) == 0) {
1312         
1313         DPRINTK(3, "interrupt NOT triggered by device %d\n", fore200e->atm_dev->number);
1314         return IRQ_NONE;
1315     }
1316     DPRINTK(3, "interrupt triggered by device %d\n", fore200e->atm_dev->number);
1317
1318 #ifdef FORE200E_USE_TASKLET
1319     tasklet_schedule(&fore200e->tx_tasklet);
1320     tasklet_schedule(&fore200e->rx_tasklet);
1321 #else
1322     fore200e_irq(fore200e);
1323 #endif
1324     
1325     fore200e->bus->irq_ack(fore200e);
1326     return IRQ_HANDLED;
1327 }
1328
1329
1330 #ifdef FORE200E_USE_TASKLET
1331 static void
1332 fore200e_tx_tasklet(unsigned long data)
1333 {
1334     struct fore200e* fore200e = (struct fore200e*) data;
1335     unsigned long flags;
1336
1337     DPRINTK(3, "tx tasklet scheduled for device %d\n", fore200e->atm_dev->number);
1338
1339     spin_lock_irqsave(&fore200e->q_lock, flags);
1340     fore200e_tx_irq(fore200e);
1341     spin_unlock_irqrestore(&fore200e->q_lock, flags);
1342 }
1343
1344
1345 static void
1346 fore200e_rx_tasklet(unsigned long data)
1347 {
1348     struct fore200e* fore200e = (struct fore200e*) data;
1349     unsigned long    flags;
1350
1351     DPRINTK(3, "rx tasklet scheduled for device %d\n", fore200e->atm_dev->number);
1352
1353     spin_lock_irqsave(&fore200e->q_lock, flags);
1354     fore200e_rx_irq((struct fore200e*) data);
1355     spin_unlock_irqrestore(&fore200e->q_lock, flags);
1356 }
1357 #endif
1358
1359
1360 static int
1361 fore200e_select_scheme(struct atm_vcc* vcc)
1362 {
1363     /* fairly balance the VCs over (identical) buffer schemes */
1364     int scheme = vcc->vci % 2 ? BUFFER_SCHEME_ONE : BUFFER_SCHEME_TWO;
1365
1366     DPRINTK(1, "VC %d.%d.%d uses buffer scheme %d\n",
1367             vcc->itf, vcc->vpi, vcc->vci, scheme);
1368
1369     return scheme;
1370 }
1371
1372
1373 static int 
1374 fore200e_activate_vcin(struct fore200e* fore200e, int activate, struct atm_vcc* vcc, int mtu)
1375 {
1376     struct host_cmdq*        cmdq  = &fore200e->host_cmdq;
1377     struct host_cmdq_entry*  entry = &cmdq->host_entry[ cmdq->head ];
1378     struct activate_opcode   activ_opcode;
1379     struct deactivate_opcode deactiv_opcode;
1380     struct vpvc              vpvc;
1381     int                      ok;
1382     enum fore200e_aal        aal = fore200e_atm2fore_aal(vcc->qos.aal);
1383
1384     FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
1385     
1386     if (activate) {
1387         FORE200E_VCC(vcc)->scheme = fore200e_select_scheme(vcc);
1388         
1389         activ_opcode.opcode = OPCODE_ACTIVATE_VCIN;
1390         activ_opcode.aal    = aal;
1391         activ_opcode.scheme = FORE200E_VCC(vcc)->scheme;
1392         activ_opcode.pad    = 0;
1393     }
1394     else {
1395         deactiv_opcode.opcode = OPCODE_DEACTIVATE_VCIN;
1396         deactiv_opcode.pad    = 0;
1397     }
1398
1399     vpvc.vci = vcc->vci;
1400     vpvc.vpi = vcc->vpi;
1401
1402     *entry->status = STATUS_PENDING;
1403
1404     if (activate) {
1405
1406 #ifdef FORE200E_52BYTE_AAL0_SDU
1407         mtu = 48;
1408 #endif
1409         /* the MTU is not used by the cp, except in the case of AAL0 */
1410         fore200e->bus->write(mtu,                        &entry->cp_entry->cmd.activate_block.mtu);
1411         fore200e->bus->write(*(u32*)&vpvc,         (u32 __iomem *)&entry->cp_entry->cmd.activate_block.vpvc);
1412         fore200e->bus->write(*(u32*)&activ_opcode, (u32 __iomem *)&entry->cp_entry->cmd.activate_block.opcode);
1413     }
1414     else {
1415         fore200e->bus->write(*(u32*)&vpvc,         (u32 __iomem *)&entry->cp_entry->cmd.deactivate_block.vpvc);
1416         fore200e->bus->write(*(u32*)&deactiv_opcode, (u32 __iomem *)&entry->cp_entry->cmd.deactivate_block.opcode);
1417     }
1418
1419     ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
1420
1421     *entry->status = STATUS_FREE;
1422
1423     if (ok == 0) {
1424         printk(FORE200E "unable to %s VC %d.%d.%d\n",
1425                activate ? "open" : "close", vcc->itf, vcc->vpi, vcc->vci);
1426         return -EIO;
1427     }
1428
1429     DPRINTK(1, "VC %d.%d.%d %sed\n", vcc->itf, vcc->vpi, vcc->vci, 
1430             activate ? "open" : "clos");
1431
1432     return 0;
1433 }
1434
1435
1436 #define FORE200E_MAX_BACK2BACK_CELLS 255    /* XXX depends on CDVT */
1437
1438 static void
1439 fore200e_rate_ctrl(struct atm_qos* qos, struct tpd_rate* rate)
1440 {
1441     if (qos->txtp.max_pcr < ATM_OC3_PCR) {
1442     
1443         /* compute the data cells to idle cells ratio from the tx PCR */
1444         rate->data_cells = qos->txtp.max_pcr * FORE200E_MAX_BACK2BACK_CELLS / ATM_OC3_PCR;
1445         rate->idle_cells = FORE200E_MAX_BACK2BACK_CELLS - rate->data_cells;
1446     }
1447     else {
1448         /* disable rate control */
1449         rate->data_cells = rate->idle_cells = 0;
1450     }
1451 }
1452
1453
1454 static int
1455 fore200e_open(struct atm_vcc *vcc)
1456 {
1457     struct fore200e*        fore200e = FORE200E_DEV(vcc->dev);
1458     struct fore200e_vcc*    fore200e_vcc;
1459     struct fore200e_vc_map* vc_map;
1460     unsigned long           flags;
1461     int                     vci = vcc->vci;
1462     short                   vpi = vcc->vpi;
1463
1464     ASSERT((vpi >= 0) && (vpi < 1<<FORE200E_VPI_BITS));
1465     ASSERT((vci >= 0) && (vci < 1<<FORE200E_VCI_BITS));
1466
1467     spin_lock_irqsave(&fore200e->q_lock, flags);
1468
1469     vc_map = FORE200E_VC_MAP(fore200e, vpi, vci);
1470     if (vc_map->vcc) {
1471
1472         spin_unlock_irqrestore(&fore200e->q_lock, flags);
1473
1474         printk(FORE200E "VC %d.%d.%d already in use\n",
1475                fore200e->atm_dev->number, vpi, vci);
1476
1477         return -EINVAL;
1478     }
1479
1480     vc_map->vcc = vcc;
1481
1482     spin_unlock_irqrestore(&fore200e->q_lock, flags);
1483
1484     fore200e_vcc = kzalloc(sizeof(struct fore200e_vcc), GFP_ATOMIC);
1485     if (fore200e_vcc == NULL) {
1486         vc_map->vcc = NULL;
1487         return -ENOMEM;
1488     }
1489
1490     DPRINTK(2, "opening %d.%d.%d:%d QoS = (tx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d; "
1491             "rx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d)\n",
1492             vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal),
1493             fore200e_traffic_class[ vcc->qos.txtp.traffic_class ],
1494             vcc->qos.txtp.min_pcr, vcc->qos.txtp.max_pcr, vcc->qos.txtp.max_cdv, vcc->qos.txtp.max_sdu,
1495             fore200e_traffic_class[ vcc->qos.rxtp.traffic_class ],
1496             vcc->qos.rxtp.min_pcr, vcc->qos.rxtp.max_pcr, vcc->qos.rxtp.max_cdv, vcc->qos.rxtp.max_sdu);
1497     
1498     /* pseudo-CBR bandwidth requested? */
1499     if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) {
1500         
1501         mutex_lock(&fore200e->rate_mtx);
1502         if (fore200e->available_cell_rate < vcc->qos.txtp.max_pcr) {
1503             mutex_unlock(&fore200e->rate_mtx);
1504
1505             kfree(fore200e_vcc);
1506             vc_map->vcc = NULL;
1507             return -EAGAIN;
1508         }
1509
1510         /* reserve bandwidth */
1511         fore200e->available_cell_rate -= vcc->qos.txtp.max_pcr;
1512         mutex_unlock(&fore200e->rate_mtx);
1513     }
1514     
1515     vcc->itf = vcc->dev->number;
1516
1517     set_bit(ATM_VF_PARTIAL,&vcc->flags);
1518     set_bit(ATM_VF_ADDR, &vcc->flags);
1519
1520     vcc->dev_data = fore200e_vcc;
1521     
1522     if (fore200e_activate_vcin(fore200e, 1, vcc, vcc->qos.rxtp.max_sdu) < 0) {
1523
1524         vc_map->vcc = NULL;
1525
1526         clear_bit(ATM_VF_ADDR, &vcc->flags);
1527         clear_bit(ATM_VF_PARTIAL,&vcc->flags);
1528
1529         vcc->dev_data = NULL;
1530
1531         fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
1532
1533         kfree(fore200e_vcc);
1534         return -EINVAL;
1535     }
1536     
1537     /* compute rate control parameters */
1538     if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) {
1539         
1540         fore200e_rate_ctrl(&vcc->qos, &fore200e_vcc->rate);
1541         set_bit(ATM_VF_HASQOS, &vcc->flags);
1542
1543         DPRINTK(3, "tx on %d.%d.%d:%d, tx PCR = %d, rx PCR = %d, data_cells = %u, idle_cells = %u\n",
1544                 vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal),
1545                 vcc->qos.txtp.max_pcr, vcc->qos.rxtp.max_pcr, 
1546                 fore200e_vcc->rate.data_cells, fore200e_vcc->rate.idle_cells);
1547     }
1548     
1549     fore200e_vcc->tx_min_pdu = fore200e_vcc->rx_min_pdu = MAX_PDU_SIZE + 1;
1550     fore200e_vcc->tx_max_pdu = fore200e_vcc->rx_max_pdu = 0;
1551     fore200e_vcc->tx_pdu     = fore200e_vcc->rx_pdu     = 0;
1552
1553     /* new incarnation of the vcc */
1554     vc_map->incarn = ++fore200e->incarn_count;
1555
1556     /* VC unusable before this flag is set */
1557     set_bit(ATM_VF_READY, &vcc->flags);
1558
1559     return 0;
1560 }
1561
1562
1563 static void
1564 fore200e_close(struct atm_vcc* vcc)
1565 {
1566     struct fore200e*        fore200e = FORE200E_DEV(vcc->dev);
1567     struct fore200e_vcc*    fore200e_vcc;
1568     struct fore200e_vc_map* vc_map;
1569     unsigned long           flags;
1570
1571     ASSERT(vcc);
1572     ASSERT((vcc->vpi >= 0) && (vcc->vpi < 1<<FORE200E_VPI_BITS));
1573     ASSERT((vcc->vci >= 0) && (vcc->vci < 1<<FORE200E_VCI_BITS));
1574
1575     DPRINTK(2, "closing %d.%d.%d:%d\n", vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal));
1576
1577     clear_bit(ATM_VF_READY, &vcc->flags);
1578
1579     fore200e_activate_vcin(fore200e, 0, vcc, 0);
1580
1581     spin_lock_irqsave(&fore200e->q_lock, flags);
1582
1583     vc_map = FORE200E_VC_MAP(fore200e, vcc->vpi, vcc->vci);
1584
1585     /* the vc is no longer considered as "in use" by fore200e_open() */
1586     vc_map->vcc = NULL;
1587
1588     vcc->itf = vcc->vci = vcc->vpi = 0;
1589
1590     fore200e_vcc = FORE200E_VCC(vcc);
1591     vcc->dev_data = NULL;
1592
1593     spin_unlock_irqrestore(&fore200e->q_lock, flags);
1594
1595     /* release reserved bandwidth, if any */
1596     if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) {
1597
1598         mutex_lock(&fore200e->rate_mtx);
1599         fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
1600         mutex_unlock(&fore200e->rate_mtx);
1601
1602         clear_bit(ATM_VF_HASQOS, &vcc->flags);
1603     }
1604
1605     clear_bit(ATM_VF_ADDR, &vcc->flags);
1606     clear_bit(ATM_VF_PARTIAL,&vcc->flags);
1607
1608     ASSERT(fore200e_vcc);
1609     kfree(fore200e_vcc);
1610 }
1611
1612
1613 static int
1614 fore200e_send(struct atm_vcc *vcc, struct sk_buff *skb)
1615 {
1616     struct fore200e*        fore200e     = FORE200E_DEV(vcc->dev);
1617     struct fore200e_vcc*    fore200e_vcc = FORE200E_VCC(vcc);
1618     struct fore200e_vc_map* vc_map;
1619     struct host_txq*        txq          = &fore200e->host_txq;
1620     struct host_txq_entry*  entry;
1621     struct tpd*             tpd;
1622     struct tpd_haddr        tpd_haddr;
1623     int                     retry        = CONFIG_ATM_FORE200E_TX_RETRY;
1624     int                     tx_copy      = 0;
1625     int                     tx_len       = skb->len;
1626     u32*                    cell_header  = NULL;
1627     unsigned char*          skb_data;
1628     int                     skb_len;
1629     unsigned char*          data;
1630     unsigned long           flags;
1631
1632     ASSERT(vcc);
1633     ASSERT(atomic_read(&sk_atm(vcc)->sk_wmem_alloc) >= 0);
1634     ASSERT(fore200e);
1635     ASSERT(fore200e_vcc);
1636
1637     if (!test_bit(ATM_VF_READY, &vcc->flags)) {
1638         DPRINTK(1, "VC %d.%d.%d not ready for tx\n", vcc->itf, vcc->vpi, vcc->vpi);
1639         dev_kfree_skb_any(skb);
1640         return -EINVAL;
1641     }
1642
1643 #ifdef FORE200E_52BYTE_AAL0_SDU
1644     if ((vcc->qos.aal == ATM_AAL0) && (vcc->qos.txtp.max_sdu == ATM_AAL0_SDU)) {
1645         cell_header = (u32*) skb->data;
1646         skb_data    = skb->data + 4;    /* skip 4-byte cell header */
1647         skb_len     = tx_len = skb->len  - 4;
1648
1649         DPRINTK(3, "user-supplied cell header = 0x%08x\n", *cell_header);
1650     }
1651     else 
1652 #endif
1653     {
1654         skb_data = skb->data;
1655         skb_len  = skb->len;
1656     }
1657     
1658     if (((unsigned long)skb_data) & 0x3) {
1659
1660         DPRINTK(2, "misaligned tx PDU on device %s\n", fore200e->name);
1661         tx_copy = 1;
1662         tx_len  = skb_len;
1663     }
1664
1665     if ((vcc->qos.aal == ATM_AAL0) && (skb_len % ATM_CELL_PAYLOAD)) {
1666
1667         /* this simply NUKES the PCA board */
1668         DPRINTK(2, "incomplete tx AAL0 PDU on device %s\n", fore200e->name);
1669         tx_copy = 1;
1670         tx_len  = ((skb_len / ATM_CELL_PAYLOAD) + 1) * ATM_CELL_PAYLOAD;
1671     }
1672     
1673     if (tx_copy) {
1674         data = kmalloc(tx_len, GFP_ATOMIC | GFP_DMA);
1675         if (data == NULL) {
1676             if (vcc->pop) {
1677                 vcc->pop(vcc, skb);
1678             }
1679             else {
1680                 dev_kfree_skb_any(skb);
1681             }
1682             return -ENOMEM;
1683         }
1684
1685         memcpy(data, skb_data, skb_len);
1686         if (skb_len < tx_len)
1687             memset(data + skb_len, 0x00, tx_len - skb_len);
1688     }
1689     else {
1690         data = skb_data;
1691     }
1692
1693     vc_map = FORE200E_VC_MAP(fore200e, vcc->vpi, vcc->vci);
1694     ASSERT(vc_map->vcc == vcc);
1695
1696   retry_here:
1697
1698     spin_lock_irqsave(&fore200e->q_lock, flags);
1699
1700     entry = &txq->host_entry[ txq->head ];
1701
1702     if ((*entry->status != STATUS_FREE) || (txq->txing >= QUEUE_SIZE_TX - 2)) {
1703
1704         /* try to free completed tx queue entries */
1705         fore200e_tx_irq(fore200e);
1706
1707         if (*entry->status != STATUS_FREE) {
1708
1709             spin_unlock_irqrestore(&fore200e->q_lock, flags);
1710
1711             /* retry once again? */
1712             if (--retry > 0) {
1713                 udelay(50);
1714                 goto retry_here;
1715             }
1716
1717             atomic_inc(&vcc->stats->tx_err);
1718
1719             fore200e->tx_sat++;
1720             DPRINTK(2, "tx queue of device %s is saturated, PDU dropped - heartbeat is %08x\n",
1721                     fore200e->name, fore200e->cp_queues->heartbeat);
1722             if (vcc->pop) {
1723                 vcc->pop(vcc, skb);
1724             }
1725             else {
1726                 dev_kfree_skb_any(skb);
1727             }
1728
1729             if (tx_copy)
1730                 kfree(data);
1731
1732             return -ENOBUFS;
1733         }
1734     }
1735
1736     entry->incarn = vc_map->incarn;
1737     entry->vc_map = vc_map;
1738     entry->skb    = skb;
1739     entry->data   = tx_copy ? data : NULL;
1740
1741     tpd = entry->tpd;
1742     tpd->tsd[ 0 ].buffer = fore200e->bus->dma_map(fore200e, data, tx_len, DMA_TO_DEVICE);
1743     tpd->tsd[ 0 ].length = tx_len;
1744
1745     FORE200E_NEXT_ENTRY(txq->head, QUEUE_SIZE_TX);
1746     txq->txing++;
1747
1748     /* The dma_map call above implies a dma_sync so the device can use it,
1749      * thus no explicit dma_sync call is necessary here.
1750      */
1751     
1752     DPRINTK(3, "tx on %d.%d.%d:%d, len = %u (%u)\n", 
1753             vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal),
1754             tpd->tsd[0].length, skb_len);
1755
1756     if (skb_len < fore200e_vcc->tx_min_pdu)
1757         fore200e_vcc->tx_min_pdu = skb_len;
1758     if (skb_len > fore200e_vcc->tx_max_pdu)
1759         fore200e_vcc->tx_max_pdu = skb_len;
1760     fore200e_vcc->tx_pdu++;
1761
1762     /* set tx rate control information */
1763     tpd->rate.data_cells = fore200e_vcc->rate.data_cells;
1764     tpd->rate.idle_cells = fore200e_vcc->rate.idle_cells;
1765
1766     if (cell_header) {
1767         tpd->atm_header.clp = (*cell_header & ATM_HDR_CLP);
1768         tpd->atm_header.plt = (*cell_header & ATM_HDR_PTI_MASK) >> ATM_HDR_PTI_SHIFT;
1769         tpd->atm_header.vci = (*cell_header & ATM_HDR_VCI_MASK) >> ATM_HDR_VCI_SHIFT;
1770         tpd->atm_header.vpi = (*cell_header & ATM_HDR_VPI_MASK) >> ATM_HDR_VPI_SHIFT;
1771         tpd->atm_header.gfc = (*cell_header & ATM_HDR_GFC_MASK) >> ATM_HDR_GFC_SHIFT;
1772     }
1773     else {
1774         /* set the ATM header, common to all cells conveying the PDU */
1775         tpd->atm_header.clp = 0;
1776         tpd->atm_header.plt = 0;
1777         tpd->atm_header.vci = vcc->vci;
1778         tpd->atm_header.vpi = vcc->vpi;
1779         tpd->atm_header.gfc = 0;
1780     }
1781
1782     tpd->spec.length = tx_len;
1783     tpd->spec.nseg   = 1;
1784     tpd->spec.aal    = fore200e_atm2fore_aal(vcc->qos.aal);
1785     tpd->spec.intr   = 1;
1786
1787     tpd_haddr.size  = sizeof(struct tpd) / (1<<TPD_HADDR_SHIFT);  /* size is expressed in 32 byte blocks */
1788     tpd_haddr.pad   = 0;
1789     tpd_haddr.haddr = entry->tpd_dma >> TPD_HADDR_SHIFT;          /* shift the address, as we are in a bitfield */
1790
1791     *entry->status = STATUS_PENDING;
1792     fore200e->bus->write(*(u32*)&tpd_haddr, (u32 __iomem *)&entry->cp_entry->tpd_haddr);
1793
1794     spin_unlock_irqrestore(&fore200e->q_lock, flags);
1795
1796     return 0;
1797 }
1798
1799
1800 static int
1801 fore200e_getstats(struct fore200e* fore200e)
1802 {
1803     struct host_cmdq*       cmdq  = &fore200e->host_cmdq;
1804     struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
1805     struct stats_opcode     opcode;
1806     int                     ok;
1807     u32                     stats_dma_addr;
1808
1809     if (fore200e->stats == NULL) {
1810         fore200e->stats = kzalloc(sizeof(struct stats), GFP_KERNEL | GFP_DMA);
1811         if (fore200e->stats == NULL)
1812             return -ENOMEM;
1813     }
1814     
1815     stats_dma_addr = fore200e->bus->dma_map(fore200e, fore200e->stats,
1816                                             sizeof(struct stats), DMA_FROM_DEVICE);
1817     
1818     FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
1819
1820     opcode.opcode = OPCODE_GET_STATS;
1821     opcode.pad    = 0;
1822
1823     fore200e->bus->write(stats_dma_addr, &entry->cp_entry->cmd.stats_block.stats_haddr);
1824     
1825     *entry->status = STATUS_PENDING;
1826
1827     fore200e->bus->write(*(u32*)&opcode, (u32 __iomem *)&entry->cp_entry->cmd.stats_block.opcode);
1828
1829     ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
1830
1831     *entry->status = STATUS_FREE;
1832
1833     fore200e->bus->dma_unmap(fore200e, stats_dma_addr, sizeof(struct stats), DMA_FROM_DEVICE);
1834     
1835     if (ok == 0) {
1836         printk(FORE200E "unable to get statistics from device %s\n", fore200e->name);
1837         return -EIO;
1838     }
1839
1840     return 0;
1841 }
1842
1843
1844 static int
1845 fore200e_getsockopt(struct atm_vcc* vcc, int level, int optname, void __user *optval, int optlen)
1846 {
1847     /* struct fore200e* fore200e = FORE200E_DEV(vcc->dev); */
1848
1849     DPRINTK(2, "getsockopt %d.%d.%d, level = %d, optname = 0x%x, optval = 0x%p, optlen = %d\n",
1850             vcc->itf, vcc->vpi, vcc->vci, level, optname, optval, optlen);
1851
1852     return -EINVAL;
1853 }
1854
1855
1856 static int
1857 fore200e_setsockopt(struct atm_vcc* vcc, int level, int optname, void __user *optval, int optlen)
1858 {
1859     /* struct fore200e* fore200e = FORE200E_DEV(vcc->dev); */
1860     
1861     DPRINTK(2, "setsockopt %d.%d.%d, level = %d, optname = 0x%x, optval = 0x%p, optlen = %d\n",
1862             vcc->itf, vcc->vpi, vcc->vci, level, optname, optval, optlen);
1863     
1864     return -EINVAL;
1865 }
1866
1867
1868 #if 0 /* currently unused */
1869 static int
1870 fore200e_get_oc3(struct fore200e* fore200e, struct oc3_regs* regs)
1871 {
1872     struct host_cmdq*       cmdq  = &fore200e->host_cmdq;
1873     struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
1874     struct oc3_opcode       opcode;
1875     int                     ok;
1876     u32                     oc3_regs_dma_addr;
1877
1878     oc3_regs_dma_addr = fore200e->bus->dma_map(fore200e, regs, sizeof(struct oc3_regs), DMA_FROM_DEVICE);
1879
1880     FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
1881
1882     opcode.opcode = OPCODE_GET_OC3;
1883     opcode.reg    = 0;
1884     opcode.value  = 0;
1885     opcode.mask   = 0;
1886
1887     fore200e->bus->write(oc3_regs_dma_addr, &entry->cp_entry->cmd.oc3_block.regs_haddr);
1888     
1889     *entry->status = STATUS_PENDING;
1890
1891     fore200e->bus->write(*(u32*)&opcode, (u32*)&entry->cp_entry->cmd.oc3_block.opcode);
1892
1893     ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
1894
1895     *entry->status = STATUS_FREE;
1896
1897     fore200e->bus->dma_unmap(fore200e, oc3_regs_dma_addr, sizeof(struct oc3_regs), DMA_FROM_DEVICE);
1898     
1899     if (ok == 0) {
1900         printk(FORE200E "unable to get OC-3 regs of device %s\n", fore200e->name);
1901         return -EIO;
1902     }
1903
1904     return 0;
1905 }
1906 #endif
1907
1908
1909 static int
1910 fore200e_set_oc3(struct fore200e* fore200e, u32 reg, u32 value, u32 mask)
1911 {
1912     struct host_cmdq*       cmdq  = &fore200e->host_cmdq;
1913     struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
1914     struct oc3_opcode       opcode;
1915     int                     ok;
1916
1917     DPRINTK(2, "set OC-3 reg = 0x%02x, value = 0x%02x, mask = 0x%02x\n", reg, value, mask);
1918
1919     FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
1920
1921     opcode.opcode = OPCODE_SET_OC3;
1922     opcode.reg    = reg;
1923     opcode.value  = value;
1924     opcode.mask   = mask;
1925
1926     fore200e->bus->write(0, &entry->cp_entry->cmd.oc3_block.regs_haddr);
1927     
1928     *entry->status = STATUS_PENDING;
1929
1930     fore200e->bus->write(*(u32*)&opcode, (u32 __iomem *)&entry->cp_entry->cmd.oc3_block.opcode);
1931
1932     ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
1933
1934     *entry->status = STATUS_FREE;
1935
1936     if (ok == 0) {
1937         printk(FORE200E "unable to set OC-3 reg 0x%02x of device %s\n", reg, fore200e->name);
1938         return -EIO;
1939     }
1940
1941     return 0;
1942 }
1943
1944
1945 static int
1946 fore200e_setloop(struct fore200e* fore200e, int loop_mode)
1947 {
1948     u32 mct_value, mct_mask;
1949     int error;
1950
1951     if (!capable(CAP_NET_ADMIN))
1952         return -EPERM;
1953     
1954     switch (loop_mode) {
1955
1956     case ATM_LM_NONE:
1957         mct_value = 0; 
1958         mct_mask  = SUNI_MCT_DLE | SUNI_MCT_LLE;
1959         break;
1960         
1961     case ATM_LM_LOC_PHY:
1962         mct_value = mct_mask = SUNI_MCT_DLE;
1963         break;
1964
1965     case ATM_LM_RMT_PHY:
1966         mct_value = mct_mask = SUNI_MCT_LLE;
1967         break;
1968
1969     default:
1970         return -EINVAL;
1971     }
1972
1973     error = fore200e_set_oc3(fore200e, SUNI_MCT, mct_value, mct_mask);
1974     if (error == 0)
1975         fore200e->loop_mode = loop_mode;
1976
1977     return error;
1978 }
1979
1980
1981 static int
1982 fore200e_fetch_stats(struct fore200e* fore200e, struct sonet_stats __user *arg)
1983 {
1984     struct sonet_stats tmp;
1985
1986     if (fore200e_getstats(fore200e) < 0)
1987         return -EIO;
1988
1989     tmp.section_bip = be32_to_cpu(fore200e->stats->oc3.section_bip8_errors);
1990     tmp.line_bip    = be32_to_cpu(fore200e->stats->oc3.line_bip24_errors);
1991     tmp.path_bip    = be32_to_cpu(fore200e->stats->oc3.path_bip8_errors);
1992     tmp.line_febe   = be32_to_cpu(fore200e->stats->oc3.line_febe_errors);
1993     tmp.path_febe   = be32_to_cpu(fore200e->stats->oc3.path_febe_errors);
1994     tmp.corr_hcs    = be32_to_cpu(fore200e->stats->oc3.corr_hcs_errors);
1995     tmp.uncorr_hcs  = be32_to_cpu(fore200e->stats->oc3.ucorr_hcs_errors);
1996     tmp.tx_cells    = be32_to_cpu(fore200e->stats->aal0.cells_transmitted)  +
1997                       be32_to_cpu(fore200e->stats->aal34.cells_transmitted) +
1998                       be32_to_cpu(fore200e->stats->aal5.cells_transmitted);
1999     tmp.rx_cells    = be32_to_cpu(fore200e->stats->aal0.cells_received)     +
2000                       be32_to_cpu(fore200e->stats->aal34.cells_received)    +
2001                       be32_to_cpu(fore200e->stats->aal5.cells_received);
2002
2003     if (arg)
2004         return copy_to_user(arg, &tmp, sizeof(struct sonet_stats)) ? -EFAULT : 0;       
2005     
2006     return 0;
2007 }
2008
2009
2010 static int
2011 fore200e_ioctl(struct atm_dev* dev, unsigned int cmd, void __user * arg)
2012 {
2013     struct fore200e* fore200e = FORE200E_DEV(dev);
2014     
2015     DPRINTK(2, "ioctl cmd = 0x%x (%u), arg = 0x%p (%lu)\n", cmd, cmd, arg, (unsigned long)arg);
2016
2017     switch (cmd) {
2018
2019     case SONET_GETSTAT:
2020         return fore200e_fetch_stats(fore200e, (struct sonet_stats __user *)arg);
2021
2022     case SONET_GETDIAG:
2023         return put_user(0, (int __user *)arg) ? -EFAULT : 0;
2024
2025     case ATM_SETLOOP:
2026         return fore200e_setloop(fore200e, (int)(unsigned long)arg);
2027
2028     case ATM_GETLOOP:
2029         return put_user(fore200e->loop_mode, (int __user *)arg) ? -EFAULT : 0;
2030
2031     case ATM_QUERYLOOP:
2032         return put_user(ATM_LM_LOC_PHY | ATM_LM_RMT_PHY, (int __user *)arg) ? -EFAULT : 0;
2033     }
2034
2035     return -ENOSYS; /* not implemented */
2036 }
2037
2038
2039 static int
2040 fore200e_change_qos(struct atm_vcc* vcc,struct atm_qos* qos, int flags)
2041 {
2042     struct fore200e_vcc* fore200e_vcc = FORE200E_VCC(vcc);
2043     struct fore200e*     fore200e     = FORE200E_DEV(vcc->dev);
2044
2045     if (!test_bit(ATM_VF_READY, &vcc->flags)) {
2046         DPRINTK(1, "VC %d.%d.%d not ready for QoS change\n", vcc->itf, vcc->vpi, vcc->vpi);
2047         return -EINVAL;
2048     }
2049
2050     DPRINTK(2, "change_qos %d.%d.%d, "
2051             "(tx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d; "
2052             "rx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d), flags = 0x%x\n"
2053             "available_cell_rate = %u",
2054             vcc->itf, vcc->vpi, vcc->vci,
2055             fore200e_traffic_class[ qos->txtp.traffic_class ],
2056             qos->txtp.min_pcr, qos->txtp.max_pcr, qos->txtp.max_cdv, qos->txtp.max_sdu,
2057             fore200e_traffic_class[ qos->rxtp.traffic_class ],
2058             qos->rxtp.min_pcr, qos->rxtp.max_pcr, qos->rxtp.max_cdv, qos->rxtp.max_sdu,
2059             flags, fore200e->available_cell_rate);
2060
2061     if ((qos->txtp.traffic_class == ATM_CBR) && (qos->txtp.max_pcr > 0)) {
2062
2063         mutex_lock(&fore200e->rate_mtx);
2064         if (fore200e->available_cell_rate + vcc->qos.txtp.max_pcr < qos->txtp.max_pcr) {
2065             mutex_unlock(&fore200e->rate_mtx);
2066             return -EAGAIN;
2067         }
2068
2069         fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
2070         fore200e->available_cell_rate -= qos->txtp.max_pcr;
2071
2072         mutex_unlock(&fore200e->rate_mtx);
2073         
2074         memcpy(&vcc->qos, qos, sizeof(struct atm_qos));
2075         
2076         /* update rate control parameters */
2077         fore200e_rate_ctrl(qos, &fore200e_vcc->rate);
2078
2079         set_bit(ATM_VF_HASQOS, &vcc->flags);
2080
2081         return 0;
2082     }
2083     
2084     return -EINVAL;
2085 }
2086     
2087
2088 static int __devinit
2089 fore200e_irq_request(struct fore200e* fore200e)
2090 {
2091     if (request_irq(fore200e->irq, fore200e_interrupt, IRQF_SHARED, fore200e->name, fore200e->atm_dev) < 0) {
2092
2093         printk(FORE200E "unable to reserve IRQ %s for device %s\n",
2094                fore200e_irq_itoa(fore200e->irq), fore200e->name);
2095         return -EBUSY;
2096     }
2097
2098     printk(FORE200E "IRQ %s reserved for device %s\n",
2099            fore200e_irq_itoa(fore200e->irq), fore200e->name);
2100
2101 #ifdef FORE200E_USE_TASKLET
2102     tasklet_init(&fore200e->tx_tasklet, fore200e_tx_tasklet, (unsigned long)fore200e);
2103     tasklet_init(&fore200e->rx_tasklet, fore200e_rx_tasklet, (unsigned long)fore200e);
2104 #endif
2105
2106     fore200e->state = FORE200E_STATE_IRQ;
2107     return 0;
2108 }
2109
2110
2111 static int __devinit
2112 fore200e_get_esi(struct fore200e* fore200e)
2113 {
2114     struct prom_data* prom = kzalloc(sizeof(struct prom_data), GFP_KERNEL | GFP_DMA);
2115     int ok, i;
2116
2117     if (!prom)
2118         return -ENOMEM;
2119
2120     ok = fore200e->bus->prom_read(fore200e, prom);
2121     if (ok < 0) {
2122         kfree(prom);
2123         return -EBUSY;
2124     }
2125         
2126     printk(FORE200E "device %s, rev. %c, S/N: %d, ESI: %02x:%02x:%02x:%02x:%02x:%02x\n", 
2127            fore200e->name, 
2128            (prom->hw_revision & 0xFF) + '@',    /* probably meaningless with SBA boards */
2129            prom->serial_number & 0xFFFF,
2130            prom->mac_addr[ 2 ], prom->mac_addr[ 3 ], prom->mac_addr[ 4 ],
2131            prom->mac_addr[ 5 ], prom->mac_addr[ 6 ], prom->mac_addr[ 7 ]);
2132         
2133     for (i = 0; i < ESI_LEN; i++) {
2134         fore200e->esi[ i ] = fore200e->atm_dev->esi[ i ] = prom->mac_addr[ i + 2 ];
2135     }
2136     
2137     kfree(prom);
2138
2139     return 0;
2140 }
2141
2142
2143 static int __devinit
2144 fore200e_alloc_rx_buf(struct fore200e* fore200e)
2145 {
2146     int scheme, magn, nbr, size, i;
2147
2148     struct host_bsq* bsq;
2149     struct buffer*   buffer;
2150
2151     for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
2152         for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
2153
2154             bsq = &fore200e->host_bsq[ scheme ][ magn ];
2155
2156             nbr  = fore200e_rx_buf_nbr[ scheme ][ magn ];
2157             size = fore200e_rx_buf_size[ scheme ][ magn ];
2158
2159             DPRINTK(2, "rx buffers %d / %d are being allocated\n", scheme, magn);
2160
2161             /* allocate the array of receive buffers */
2162             buffer = bsq->buffer = kzalloc(nbr * sizeof(struct buffer), GFP_KERNEL);
2163
2164             if (buffer == NULL)
2165                 return -ENOMEM;
2166
2167             bsq->freebuf = NULL;
2168
2169             for (i = 0; i < nbr; i++) {
2170
2171                 buffer[ i ].scheme = scheme;
2172                 buffer[ i ].magn   = magn;
2173 #ifdef FORE200E_BSQ_DEBUG
2174                 buffer[ i ].index  = i;
2175                 buffer[ i ].supplied = 0;
2176 #endif
2177
2178                 /* allocate the receive buffer body */
2179                 if (fore200e_chunk_alloc(fore200e,
2180                                          &buffer[ i ].data, size, fore200e->bus->buffer_alignment,
2181                                          DMA_FROM_DEVICE) < 0) {
2182                     
2183                     while (i > 0)
2184                         fore200e_chunk_free(fore200e, &buffer[ --i ].data);
2185                     kfree(buffer);
2186                     
2187                     return -ENOMEM;
2188                 }
2189
2190                 /* insert the buffer into the free buffer list */
2191                 buffer[ i ].next = bsq->freebuf;
2192                 bsq->freebuf = &buffer[ i ];
2193             }
2194             /* all the buffers are free, initially */
2195             bsq->freebuf_count = nbr;
2196
2197 #ifdef FORE200E_BSQ_DEBUG
2198             bsq_audit(3, bsq, scheme, magn);
2199 #endif
2200         }
2201     }
2202
2203     fore200e->state = FORE200E_STATE_ALLOC_BUF;
2204     return 0;
2205 }
2206
2207
2208 static int __devinit
2209 fore200e_init_bs_queue(struct fore200e* fore200e)
2210 {
2211     int scheme, magn, i;
2212
2213     struct host_bsq*     bsq;
2214     struct cp_bsq_entry __iomem * cp_entry;
2215
2216     for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
2217         for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
2218
2219             DPRINTK(2, "buffer supply queue %d / %d is being initialized\n", scheme, magn);
2220
2221             bsq = &fore200e->host_bsq[ scheme ][ magn ];
2222
2223             /* allocate and align the array of status words */
2224             if (fore200e->bus->dma_chunk_alloc(fore200e,
2225                                                &bsq->status,
2226                                                sizeof(enum status), 
2227                                                QUEUE_SIZE_BS,
2228                                                fore200e->bus->status_alignment) < 0) {
2229                 return -ENOMEM;
2230             }
2231
2232             /* allocate and align the array of receive buffer descriptors */
2233             if (fore200e->bus->dma_chunk_alloc(fore200e,
2234                                                &bsq->rbd_block,
2235                                                sizeof(struct rbd_block),
2236                                                QUEUE_SIZE_BS,
2237                                                fore200e->bus->descr_alignment) < 0) {
2238                 
2239                 fore200e->bus->dma_chunk_free(fore200e, &bsq->status);
2240                 return -ENOMEM;
2241             }
2242             
2243             /* get the base address of the cp resident buffer supply queue entries */
2244             cp_entry = fore200e->virt_base + 
2245                        fore200e->bus->read(&fore200e->cp_queues->cp_bsq[ scheme ][ magn ]);
2246             
2247             /* fill the host resident and cp resident buffer supply queue entries */
2248             for (i = 0; i < QUEUE_SIZE_BS; i++) {
2249                 
2250                 bsq->host_entry[ i ].status = 
2251                                      FORE200E_INDEX(bsq->status.align_addr, enum status, i);
2252                 bsq->host_entry[ i ].rbd_block =
2253                                      FORE200E_INDEX(bsq->rbd_block.align_addr, struct rbd_block, i);
2254                 bsq->host_entry[ i ].rbd_block_dma =
2255                                      FORE200E_DMA_INDEX(bsq->rbd_block.dma_addr, struct rbd_block, i);
2256                 bsq->host_entry[ i ].cp_entry = &cp_entry[ i ];
2257                 
2258                 *bsq->host_entry[ i ].status = STATUS_FREE;
2259                 
2260                 fore200e->bus->write(FORE200E_DMA_INDEX(bsq->status.dma_addr, enum status, i), 
2261                                      &cp_entry[ i ].status_haddr);
2262             }
2263         }
2264     }
2265
2266     fore200e->state = FORE200E_STATE_INIT_BSQ;
2267     return 0;
2268 }
2269
2270
2271 static int __devinit
2272 fore200e_init_rx_queue(struct fore200e* fore200e)
2273 {
2274     struct host_rxq*     rxq =  &fore200e->host_rxq;
2275     struct cp_rxq_entry __iomem * cp_entry;
2276     int i;
2277
2278     DPRINTK(2, "receive queue is being initialized\n");
2279
2280     /* allocate and align the array of status words */
2281     if (fore200e->bus->dma_chunk_alloc(fore200e,
2282                                        &rxq->status,
2283                                        sizeof(enum status), 
2284                                        QUEUE_SIZE_RX,
2285                                        fore200e->bus->status_alignment) < 0) {
2286         return -ENOMEM;
2287     }
2288
2289     /* allocate and align the array of receive PDU descriptors */
2290     if (fore200e->bus->dma_chunk_alloc(fore200e,
2291                                        &rxq->rpd,
2292                                        sizeof(struct rpd), 
2293                                        QUEUE_SIZE_RX,
2294                                        fore200e->bus->descr_alignment) < 0) {
2295         
2296         fore200e->bus->dma_chunk_free(fore200e, &rxq->status);
2297         return -ENOMEM;
2298     }
2299
2300     /* get the base address of the cp resident rx queue entries */
2301     cp_entry = fore200e->virt_base + fore200e->bus->read(&fore200e->cp_queues->cp_rxq);
2302
2303     /* fill the host resident and cp resident rx entries */
2304     for (i=0; i < QUEUE_SIZE_RX; i++) {
2305         
2306         rxq->host_entry[ i ].status = 
2307                              FORE200E_INDEX(rxq->status.align_addr, enum status, i);
2308         rxq->host_entry[ i ].rpd = 
2309                              FORE200E_INDEX(rxq->rpd.align_addr, struct rpd, i);
2310         rxq->host_entry[ i ].rpd_dma = 
2311                              FORE200E_DMA_INDEX(rxq->rpd.dma_addr, struct rpd, i);
2312         rxq->host_entry[ i ].cp_entry = &cp_entry[ i ];
2313
2314         *rxq->host_entry[ i ].status = STATUS_FREE;
2315
2316         fore200e->bus->write(FORE200E_DMA_INDEX(rxq->status.dma_addr, enum status, i), 
2317                              &cp_entry[ i ].status_haddr);
2318
2319         fore200e->bus->write(FORE200E_DMA_INDEX(rxq->rpd.dma_addr, struct rpd, i),
2320                              &cp_entry[ i ].rpd_haddr);
2321     }
2322
2323     /* set the head entry of the queue */
2324     rxq->head = 0;
2325
2326     fore200e->state = FORE200E_STATE_INIT_RXQ;
2327     return 0;
2328 }
2329
2330
2331 static int __devinit
2332 fore200e_init_tx_queue(struct fore200e* fore200e)
2333 {
2334     struct host_txq*     txq =  &fore200e->host_txq;
2335     struct cp_txq_entry __iomem * cp_entry;
2336     int i;
2337
2338     DPRINTK(2, "transmit queue is being initialized\n");
2339
2340     /* allocate and align the array of status words */
2341     if (fore200e->bus->dma_chunk_alloc(fore200e,
2342                                        &txq->status,
2343                                        sizeof(enum status), 
2344                                        QUEUE_SIZE_TX,
2345                                        fore200e->bus->status_alignment) < 0) {
2346         return -ENOMEM;
2347     }
2348
2349     /* allocate and align the array of transmit PDU descriptors */
2350     if (fore200e->bus->dma_chunk_alloc(fore200e,
2351                                        &txq->tpd,
2352                                        sizeof(struct tpd), 
2353                                        QUEUE_SIZE_TX,
2354                                        fore200e->bus->descr_alignment) < 0) {
2355         
2356         fore200e->bus->dma_chunk_free(fore200e, &txq->status);
2357         return -ENOMEM;
2358     }
2359
2360     /* get the base address of the cp resident tx queue entries */
2361     cp_entry = fore200e->virt_base + fore200e->bus->read(&fore200e->cp_queues->cp_txq);
2362
2363     /* fill the host resident and cp resident tx entries */
2364     for (i=0; i < QUEUE_SIZE_TX; i++) {
2365         
2366         txq->host_entry[ i ].status = 
2367                              FORE200E_INDEX(txq->status.align_addr, enum status, i);
2368         txq->host_entry[ i ].tpd = 
2369                              FORE200E_INDEX(txq->tpd.align_addr, struct tpd, i);
2370         txq->host_entry[ i ].tpd_dma  = 
2371                              FORE200E_DMA_INDEX(txq->tpd.dma_addr, struct tpd, i);
2372         txq->host_entry[ i ].cp_entry = &cp_entry[ i ];
2373
2374         *txq->host_entry[ i ].status = STATUS_FREE;
2375         
2376         fore200e->bus->write(FORE200E_DMA_INDEX(txq->status.dma_addr, enum status, i), 
2377                              &cp_entry[ i ].status_haddr);
2378         
2379         /* although there is a one-to-one mapping of tx queue entries and tpds,
2380            we do not write here the DMA (physical) base address of each tpd into
2381            the related cp resident entry, because the cp relies on this write
2382            operation to detect that a new pdu has been submitted for tx */
2383     }
2384
2385     /* set the head and tail entries of the queue */
2386     txq->head = 0;
2387     txq->tail = 0;
2388
2389     fore200e->state = FORE200E_STATE_INIT_TXQ;
2390     return 0;
2391 }
2392
2393
2394 static int __devinit
2395 fore200e_init_cmd_queue(struct fore200e* fore200e)
2396 {
2397     struct host_cmdq*     cmdq =  &fore200e->host_cmdq;
2398     struct cp_cmdq_entry __iomem * cp_entry;
2399     int i;
2400
2401     DPRINTK(2, "command queue is being initialized\n");
2402
2403     /* allocate and align the array of status words */
2404     if (fore200e->bus->dma_chunk_alloc(fore200e,
2405                                        &cmdq->status,
2406                                        sizeof(enum status), 
2407                                        QUEUE_SIZE_CMD,
2408                                        fore200e->bus->status_alignment) < 0) {
2409         return -ENOMEM;
2410     }
2411     
2412     /* get the base address of the cp resident cmd queue entries */
2413     cp_entry = fore200e->virt_base + fore200e->bus->read(&fore200e->cp_queues->cp_cmdq);
2414
2415     /* fill the host resident and cp resident cmd entries */
2416     for (i=0; i < QUEUE_SIZE_CMD; i++) {
2417         
2418         cmdq->host_entry[ i ].status   = 
2419                               FORE200E_INDEX(cmdq->status.align_addr, enum status, i);
2420         cmdq->host_entry[ i ].cp_entry = &cp_entry[ i ];
2421
2422         *cmdq->host_entry[ i ].status = STATUS_FREE;
2423
2424         fore200e->bus->write(FORE200E_DMA_INDEX(cmdq->status.dma_addr, enum status, i), 
2425                              &cp_entry[ i ].status_haddr);
2426     }
2427
2428     /* set the head entry of the queue */
2429     cmdq->head = 0;
2430
2431     fore200e->state = FORE200E_STATE_INIT_CMDQ;
2432     return 0;
2433 }
2434
2435
2436 static void __devinit
2437 fore200e_param_bs_queue(struct fore200e* fore200e,
2438                         enum buffer_scheme scheme, enum buffer_magn magn,
2439                         int queue_length, int pool_size, int supply_blksize)
2440 {
2441     struct bs_spec __iomem * bs_spec = &fore200e->cp_queues->init.bs_spec[ scheme ][ magn ];
2442
2443     fore200e->bus->write(queue_length,                           &bs_spec->queue_length);
2444     fore200e->bus->write(fore200e_rx_buf_size[ scheme ][ magn ], &bs_spec->buffer_size);
2445     fore200e->bus->write(pool_size,                              &bs_spec->pool_size);
2446     fore200e->bus->write(supply_blksize,                         &bs_spec->supply_blksize);
2447 }
2448
2449
2450 static int __devinit
2451 fore200e_initialize(struct fore200e* fore200e)
2452 {
2453     struct cp_queues __iomem * cpq;
2454     int               ok, scheme, magn;
2455
2456     DPRINTK(2, "device %s being initialized\n", fore200e->name);
2457
2458     mutex_init(&fore200e->rate_mtx);
2459     spin_lock_init(&fore200e->q_lock);
2460
2461     cpq = fore200e->cp_queues = fore200e->virt_base + FORE200E_CP_QUEUES_OFFSET;
2462
2463     /* enable cp to host interrupts */
2464     fore200e->bus->write(1, &cpq->imask);
2465
2466     if (fore200e->bus->irq_enable)
2467         fore200e->bus->irq_enable(fore200e);
2468     
2469     fore200e->bus->write(NBR_CONNECT, &cpq->init.num_connect);
2470
2471     fore200e->bus->write(QUEUE_SIZE_CMD, &cpq->init.cmd_queue_len);
2472     fore200e->bus->write(QUEUE_SIZE_RX,  &cpq->init.rx_queue_len);
2473     fore200e->bus->write(QUEUE_SIZE_TX,  &cpq->init.tx_queue_len);
2474
2475     fore200e->bus->write(RSD_EXTENSION,  &cpq->init.rsd_extension);
2476     fore200e->bus->write(TSD_EXTENSION,  &cpq->init.tsd_extension);
2477
2478     for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++)
2479         for (magn = 0; magn < BUFFER_MAGN_NBR; magn++)
2480             fore200e_param_bs_queue(fore200e, scheme, magn,
2481                                     QUEUE_SIZE_BS, 
2482                                     fore200e_rx_buf_nbr[ scheme ][ magn ],
2483                                     RBD_BLK_SIZE);
2484
2485     /* issue the initialize command */
2486     fore200e->bus->write(STATUS_PENDING,    &cpq->init.status);
2487     fore200e->bus->write(OPCODE_INITIALIZE, &cpq->init.opcode);
2488
2489     ok = fore200e_io_poll(fore200e, &cpq->init.status, STATUS_COMPLETE, 3000);
2490     if (ok == 0) {
2491         printk(FORE200E "device %s initialization failed\n", fore200e->name);
2492         return -ENODEV;
2493     }
2494
2495     printk(FORE200E "device %s initialized\n", fore200e->name);
2496
2497     fore200e->state = FORE200E_STATE_INITIALIZE;
2498     return 0;
2499 }
2500
2501
2502 static void __devinit
2503 fore200e_monitor_putc(struct fore200e* fore200e, char c)
2504 {
2505     struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
2506
2507 #if 0
2508     printk("%c", c);
2509 #endif
2510     fore200e->bus->write(((u32) c) | FORE200E_CP_MONITOR_UART_AVAIL, &monitor->soft_uart.send);
2511 }
2512
2513
2514 static int __devinit
2515 fore200e_monitor_getc(struct fore200e* fore200e)
2516 {
2517     struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
2518     unsigned long      timeout = jiffies + msecs_to_jiffies(50);
2519     int                c;
2520
2521     while (time_before(jiffies, timeout)) {
2522
2523         c = (int) fore200e->bus->read(&monitor->soft_uart.recv);
2524
2525         if (c & FORE200E_CP_MONITOR_UART_AVAIL) {
2526
2527             fore200e->bus->write(FORE200E_CP_MONITOR_UART_FREE, &monitor->soft_uart.recv);
2528 #if 0
2529             printk("%c", c & 0xFF);
2530 #endif
2531             return c & 0xFF;
2532         }
2533     }
2534
2535     return -1;
2536 }
2537
2538
2539 static void __devinit
2540 fore200e_monitor_puts(struct fore200e* fore200e, char* str)
2541 {
2542     while (*str) {
2543
2544         /* the i960 monitor doesn't accept any new character if it has something to say */
2545         while (fore200e_monitor_getc(fore200e) >= 0);
2546         
2547         fore200e_monitor_putc(fore200e, *str++);
2548     }
2549
2550     while (fore200e_monitor_getc(fore200e) >= 0);
2551 }
2552
2553 #ifdef __LITTLE_ENDIAN
2554 #define FW_EXT ".bin"
2555 #else
2556 #define FW_EXT "_ecd.bin2"
2557 #endif
2558
2559 static int __devinit
2560 fore200e_load_and_start_fw(struct fore200e* fore200e)
2561 {
2562     const struct firmware *firmware;
2563     struct device *device;
2564     struct fw_header *fw_header;
2565     u32 *fw_data, fw_size;
2566     u32 __iomem *load_addr;
2567     char buf[48];
2568     int err = -ENODEV;
2569
2570     if (strcmp(fore200e->bus->model_name, "PCA-200E") == 0)
2571         device = &((struct pci_dev *) fore200e->bus_dev)->dev;
2572 #ifdef CONFIG_SBUS
2573     else if (strcmp(fore200e->bus->model_name, "SBA-200E") == 0)
2574         device = &((struct sbus_dev *) fore200e->bus_dev)->ofdev.dev;
2575 #endif
2576     else
2577         return err;
2578
2579     sprintf(buf, "%s%s", fore200e->bus->proc_name, FW_EXT);
2580     if (request_firmware(&firmware, buf, device) == 1) {
2581         printk(FORE200E "missing %s firmware image\n", fore200e->bus->model_name);
2582         return err;
2583     }
2584
2585     fw_data = (u32 *) firmware->data;
2586     fw_size = firmware->size / sizeof(u32);
2587     fw_header = (struct fw_header *) firmware->data;
2588     load_addr = fore200e->virt_base + le32_to_cpu(fw_header->load_offset);
2589
2590     DPRINTK(2, "device %s firmware being loaded at 0x%p (%d words)\n",
2591             fore200e->name, load_addr, fw_size);
2592
2593     if (le32_to_cpu(fw_header->magic) != FW_HEADER_MAGIC) {
2594         printk(FORE200E "corrupted %s firmware image\n", fore200e->bus->model_name);
2595         goto release;
2596     }
2597
2598     for (; fw_size--; fw_data++, load_addr++)
2599         fore200e->bus->write(le32_to_cpu(*fw_data), load_addr);
2600
2601     DPRINTK(2, "device %s firmware being started\n", fore200e->name);
2602
2603 #if defined(__sparc_v9__)
2604     /* reported to be required by SBA cards on some sparc64 hosts */
2605     fore200e_spin(100);
2606 #endif
2607
2608     sprintf(buf, "\rgo %x\r", le32_to_cpu(fw_header->start_offset));
2609     fore200e_monitor_puts(fore200e, buf);
2610
2611     if (fore200e_io_poll(fore200e, &fore200e->cp_monitor->bstat, BSTAT_CP_RUNNING, 1000) == 0) {
2612         printk(FORE200E "device %s firmware didn't start\n", fore200e->name);
2613         goto release;
2614     }
2615
2616     printk(FORE200E "device %s firmware started\n", fore200e->name);
2617
2618     fore200e->state = FORE200E_STATE_START_FW;
2619     err = 0;
2620
2621 release:
2622     release_firmware(firmware);
2623     return err;
2624 }
2625
2626
2627 static int __devinit
2628 fore200e_register(struct fore200e* fore200e)
2629 {
2630     struct atm_dev* atm_dev;
2631
2632     DPRINTK(2, "device %s being registered\n", fore200e->name);
2633
2634     atm_dev = atm_dev_register(fore200e->bus->proc_name, &fore200e_ops, -1,
2635       NULL); 
2636     if (atm_dev == NULL) {
2637         printk(FORE200E "unable to register device %s\n", fore200e->name);
2638         return -ENODEV;
2639     }
2640
2641     atm_dev->dev_data = fore200e;
2642     fore200e->atm_dev = atm_dev;
2643
2644     atm_dev->ci_range.vpi_bits = FORE200E_VPI_BITS;
2645     atm_dev->ci_range.vci_bits = FORE200E_VCI_BITS;
2646
2647     fore200e->available_cell_rate = ATM_OC3_PCR;
2648
2649     fore200e->state = FORE200E_STATE_REGISTER;
2650     return 0;
2651 }
2652
2653
2654 static int __devinit
2655 fore200e_init(struct fore200e* fore200e)
2656 {
2657     if (fore200e_register(fore200e) < 0)
2658         return -ENODEV;
2659     
2660     if (fore200e->bus->configure(fore200e) < 0)
2661         return -ENODEV;
2662
2663     if (fore200e->bus->map(fore200e) < 0)
2664         return -ENODEV;
2665
2666     if (fore200e_reset(fore200e, 1) < 0)
2667         return -ENODEV;
2668
2669     if (fore200e_load_and_start_fw(fore200e) < 0)
2670         return -ENODEV;
2671
2672     if (fore200e_initialize(fore200e) < 0)
2673         return -ENODEV;
2674
2675     if (fore200e_init_cmd_queue(fore200e) < 0)
2676         return -ENOMEM;
2677
2678     if (fore200e_init_tx_queue(fore200e) < 0)
2679         return -ENOMEM;
2680
2681     if (fore200e_init_rx_queue(fore200e) < 0)
2682         return -ENOMEM;
2683
2684     if (fore200e_init_bs_queue(fore200e) < 0)
2685         return -ENOMEM;
2686
2687     if (fore200e_alloc_rx_buf(fore200e) < 0)
2688         return -ENOMEM;
2689
2690     if (fore200e_get_esi(fore200e) < 0)
2691         return -EIO;
2692
2693     if (fore200e_irq_request(fore200e) < 0)
2694         return -EBUSY;
2695
2696     fore200e_supply(fore200e);
2697
2698     /* all done, board initialization is now complete */
2699     fore200e->state = FORE200E_STATE_COMPLETE;
2700     return 0;
2701 }
2702
2703 #ifdef CONFIG_PCI
2704 static int __devinit
2705 fore200e_pca_detect(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
2706 {
2707     const struct fore200e_bus* bus = (struct fore200e_bus*) pci_ent->driver_data;
2708     struct fore200e* fore200e;
2709     int err = 0;
2710     static int index = 0;
2711
2712     if (pci_enable_device(pci_dev)) {
2713         err = -EINVAL;
2714         goto out;
2715     }
2716     
2717     fore200e = kzalloc(sizeof(struct fore200e), GFP_KERNEL);
2718     if (fore200e == NULL) {
2719         err = -ENOMEM;
2720         goto out_disable;
2721     }
2722
2723     fore200e->bus       = bus;
2724     fore200e->bus_dev   = pci_dev;    
2725     fore200e->irq       = pci_dev->irq;
2726     fore200e->phys_base = pci_resource_start(pci_dev, 0);
2727
2728     sprintf(fore200e->name, "%s-%d", bus->model_name, index - 1);
2729
2730     pci_set_master(pci_dev);
2731
2732     printk(FORE200E "device %s found at 0x%lx, IRQ %s\n",
2733            fore200e->bus->model_name, 
2734            fore200e->phys_base, fore200e_irq_itoa(fore200e->irq));
2735
2736     sprintf(fore200e->name, "%s-%d", bus->model_name, index);
2737
2738     err = fore200e_init(fore200e);
2739     if (err < 0) {
2740         fore200e_shutdown(fore200e);
2741         goto out_free;
2742     }
2743
2744     ++index;
2745     pci_set_drvdata(pci_dev, fore200e);
2746
2747 out:
2748     return err;
2749
2750 out_free:
2751     kfree(fore200e);
2752 out_disable:
2753     pci_disable_device(pci_dev);
2754     goto out;
2755 }
2756
2757
2758 static void __devexit fore200e_pca_remove_one(struct pci_dev *pci_dev)
2759 {
2760     struct fore200e *fore200e;
2761
2762     fore200e = pci_get_drvdata(pci_dev);
2763
2764     fore200e_shutdown(fore200e);
2765     kfree(fore200e);
2766     pci_disable_device(pci_dev);
2767 }
2768
2769
2770 static struct pci_device_id fore200e_pca_tbl[] = {
2771     { PCI_VENDOR_ID_FORE, PCI_DEVICE_ID_FORE_PCA200E, PCI_ANY_ID, PCI_ANY_ID,
2772       0, 0, (unsigned long) &fore200e_bus[0] },
2773     { 0, }
2774 };
2775
2776 MODULE_DEVICE_TABLE(pci, fore200e_pca_tbl);
2777
2778 static struct pci_driver fore200e_pca_driver = {
2779     .name =     "fore_200e",
2780     .probe =    fore200e_pca_detect,
2781     .remove =   __devexit_p(fore200e_pca_remove_one),
2782     .id_table = fore200e_pca_tbl,
2783 };
2784 #endif
2785
2786
2787 static int __init
2788 fore200e_module_init(void)
2789 {
2790     const struct fore200e_bus* bus;
2791     struct       fore200e*     fore200e;
2792     int                        index;
2793
2794     printk(FORE200E "FORE Systems 200E-series ATM driver - version " FORE200E_VERSION "\n");
2795
2796     /* for each configured bus interface */
2797     for (bus = fore200e_bus; bus->model_name; bus++) {
2798
2799         /* detect all boards present on that bus */
2800         for (index = 0; bus->detect && (fore200e = bus->detect(bus, index)); index++) {
2801             
2802             printk(FORE200E "device %s found at 0x%lx, IRQ %s\n",
2803                    fore200e->bus->model_name, 
2804                    fore200e->phys_base, fore200e_irq_itoa(fore200e->irq));
2805
2806             sprintf(fore200e->name, "%s-%d", bus->model_name, index);
2807
2808             if (fore200e_init(fore200e) < 0) {
2809
2810                 fore200e_shutdown(fore200e);
2811                 break;
2812             }
2813
2814             list_add(&fore200e->entry, &fore200e_boards);
2815         }
2816     }
2817
2818 #ifdef CONFIG_PCI
2819     if (!pci_register_driver(&fore200e_pca_driver))
2820         return 0;
2821 #endif
2822
2823     if (!list_empty(&fore200e_boards))
2824         return 0;
2825
2826     return -ENODEV;
2827 }
2828
2829
2830 static void __exit
2831 fore200e_module_cleanup(void)
2832 {
2833     struct fore200e *fore200e, *next;
2834
2835 #ifdef CONFIG_PCI
2836     pci_unregister_driver(&fore200e_pca_driver);
2837 #endif
2838
2839     list_for_each_entry_safe(fore200e, next, &fore200e_boards, entry) {
2840         fore200e_shutdown(fore200e);
2841         kfree(fore200e);
2842     }
2843     DPRINTK(1, "module being removed\n");
2844 }
2845
2846
2847 static int
2848 fore200e_proc_read(struct atm_dev *dev, loff_t* pos, char* page)
2849 {
2850     struct fore200e*     fore200e  = FORE200E_DEV(dev);
2851     struct fore200e_vcc* fore200e_vcc;
2852     struct atm_vcc*      vcc;
2853     int                  i, len, left = *pos;
2854     unsigned long        flags;
2855
2856     if (!left--) {
2857
2858         if (fore200e_getstats(fore200e) < 0)
2859             return -EIO;
2860
2861         len = sprintf(page,"\n"
2862                        " device:\n"
2863                        "   internal name:\t\t%s\n", fore200e->name);
2864
2865         /* print bus-specific information */
2866         if (fore200e->bus->proc_read)
2867             len += fore200e->bus->proc_read(fore200e, page + len);
2868         
2869         len += sprintf(page + len,
2870                 "   interrupt line:\t\t%s\n"
2871                 "   physical base address:\t0x%p\n"
2872                 "   virtual base address:\t0x%p\n"
2873                 "   factory address (ESI):\t%02x:%02x:%02x:%02x:%02x:%02x\n"
2874                 "   board serial number:\t\t%d\n\n",
2875                 fore200e_irq_itoa(fore200e->irq),
2876                 (void*)fore200e->phys_base,
2877                 fore200e->virt_base,
2878                 fore200e->esi[0], fore200e->esi[1], fore200e->esi[2],
2879                 fore200e->esi[3], fore200e->esi[4], fore200e->esi[5],
2880                 fore200e->esi[4] * 256 + fore200e->esi[5]);
2881
2882         return len;
2883     }
2884
2885     if (!left--)
2886         return sprintf(page,
2887                        "   free small bufs, scheme 1:\t%d\n"
2888                        "   free large bufs, scheme 1:\t%d\n"
2889                        "   free small bufs, scheme 2:\t%d\n"
2890                        "   free large bufs, scheme 2:\t%d\n",
2891                        fore200e->host_bsq[ BUFFER_SCHEME_ONE ][ BUFFER_MAGN_SMALL ].freebuf_count,
2892                        fore200e->host_bsq[ BUFFER_SCHEME_ONE ][ BUFFER_MAGN_LARGE ].freebuf_count,
2893                        fore200e->host_bsq[ BUFFER_SCHEME_TWO ][ BUFFER_MAGN_SMALL ].freebuf_count,
2894                        fore200e->host_bsq[ BUFFER_SCHEME_TWO ][ BUFFER_MAGN_LARGE ].freebuf_count);
2895
2896     if (!left--) {
2897         u32 hb = fore200e->bus->read(&fore200e->cp_queues->heartbeat);
2898
2899         len = sprintf(page,"\n\n"
2900                       " cell processor:\n"
2901                       "   heartbeat state:\t\t");
2902         
2903         if (hb >> 16 != 0xDEAD)
2904             len += sprintf(page + len, "0x%08x\n", hb);
2905         else
2906             len += sprintf(page + len, "*** FATAL ERROR %04x ***\n", hb & 0xFFFF);
2907
2908         return len;
2909     }
2910
2911     if (!left--) {
2912         static const char* media_name[] = {
2913             "unshielded twisted pair",
2914             "multimode optical fiber ST",
2915             "multimode optical fiber SC",
2916             "single-mode optical fiber ST",
2917             "single-mode optical fiber SC",
2918             "unknown"
2919         };
2920
2921         static const char* oc3_mode[] = {
2922             "normal operation",
2923             "diagnostic loopback",
2924             "line loopback",
2925             "unknown"
2926         };
2927
2928         u32 fw_release     = fore200e->bus->read(&fore200e->cp_queues->fw_release);
2929         u32 mon960_release = fore200e->bus->read(&fore200e->cp_queues->mon960_release);
2930         u32 oc3_revision   = fore200e->bus->read(&fore200e->cp_queues->oc3_revision);
2931         u32 media_index    = FORE200E_MEDIA_INDEX(fore200e->bus->read(&fore200e->cp_queues->media_type));
2932         u32 oc3_index;
2933
2934         if ((media_index < 0) || (media_index > 4))
2935             media_index = 5;
2936         
2937         switch (fore200e->loop_mode) {
2938             case ATM_LM_NONE:    oc3_index = 0;
2939                                  break;
2940             case ATM_LM_LOC_PHY: oc3_index = 1;
2941                                  break;
2942             case ATM_LM_RMT_PHY: oc3_index = 2;
2943                                  break;
2944             default:             oc3_index = 3;
2945         }
2946
2947         return sprintf(page,
2948                        "   firmware release:\t\t%d.%d.%d\n"
2949                        "   monitor release:\t\t%d.%d\n"
2950                        "   media type:\t\t\t%s\n"
2951                        "   OC-3 revision:\t\t0x%x\n"
2952                        "   OC-3 mode:\t\t\t%s",
2953                        fw_release >> 16, fw_release << 16 >> 24,  fw_release << 24 >> 24,
2954                        mon960_release >> 16, mon960_release << 16 >> 16,
2955                        media_name[ media_index ],
2956                        oc3_revision,
2957                        oc3_mode[ oc3_index ]);
2958     }
2959
2960     if (!left--) {
2961         struct cp_monitor __iomem * cp_monitor = fore200e->cp_monitor;
2962
2963         return sprintf(page,
2964                        "\n\n"
2965                        " monitor:\n"
2966                        "   version number:\t\t%d\n"
2967                        "   boot status word:\t\t0x%08x\n",
2968                        fore200e->bus->read(&cp_monitor->mon_version),
2969                        fore200e->bus->read(&cp_monitor->bstat));
2970     }
2971
2972     if (!left--)
2973         return sprintf(page,
2974                        "\n"
2975                        " device statistics:\n"
2976                        "  4b5b:\n"
2977                        "     crc_header_errors:\t\t%10u\n"
2978                        "     framing_errors:\t\t%10u\n",
2979                        be32_to_cpu(fore200e->stats->phy.crc_header_errors),
2980                        be32_to_cpu(fore200e->stats->phy.framing_errors));
2981     
2982     if (!left--)
2983         return sprintf(page, "\n"
2984                        "  OC-3:\n"
2985                        "     section_bip8_errors:\t%10u\n"
2986                        "     path_bip8_errors:\t\t%10u\n"
2987                        "     line_bip24_errors:\t\t%10u\n"
2988                        "     line_febe_errors:\t\t%10u\n"
2989                        "     path_febe_errors:\t\t%10u\n"
2990                        "     corr_hcs_errors:\t\t%10u\n"
2991                        "     ucorr_hcs_errors:\t\t%10u\n",
2992                        be32_to_cpu(fore200e->stats->oc3.section_bip8_errors),
2993                        be32_to_cpu(fore200e->stats->oc3.path_bip8_errors),
2994                        be32_to_cpu(fore200e->stats->oc3.line_bip24_errors),
2995                        be32_to_cpu(fore200e->stats->oc3.line_febe_errors),
2996                        be32_to_cpu(fore200e->stats->oc3.path_febe_errors),
2997                        be32_to_cpu(fore200e->stats->oc3.corr_hcs_errors),
2998                        be32_to_cpu(fore200e->stats->oc3.ucorr_hcs_errors));
2999
3000     if (!left--)
3001         return sprintf(page,"\n"
3002                        "   ATM:\t\t\t\t     cells\n"
3003                        "     TX:\t\t\t%10u\n"
3004                        "     RX:\t\t\t%10u\n"
3005                        "     vpi out of range:\t\t%10u\n"
3006                        "     vpi no conn:\t\t%10u\n"
3007                        "     vci out of range:\t\t%10u\n"
3008                        "     vci no conn:\t\t%10u\n",
3009                        be32_to_cpu(fore200e->stats->atm.cells_transmitted),
3010                        be32_to_cpu(fore200e->stats->atm.cells_received),
3011                        be32_to_cpu(fore200e->stats->atm.vpi_bad_range),
3012                        be32_to_cpu(fore200e->stats->atm.vpi_no_conn),
3013                        be32_to_cpu(fore200e->stats->atm.vci_bad_range),
3014                        be32_to_cpu(fore200e->stats->atm.vci_no_conn));
3015     
3016     if (!left--)
3017         return sprintf(page,"\n"
3018                        "   AAL0:\t\t\t     cells\n"
3019                        "     TX:\t\t\t%10u\n"
3020                        "     RX:\t\t\t%10u\n"
3021                        "     dropped:\t\t\t%10u\n",
3022                        be32_to_cpu(fore200e->stats->aal0.cells_transmitted),
3023                        be32_to_cpu(fore200e->stats->aal0.cells_received),
3024                        be32_to_cpu(fore200e->stats->aal0.cells_dropped));
3025     
3026     if (!left--)
3027         return sprintf(page,"\n"
3028                        "   AAL3/4:\n"
3029                        "     SAR sublayer:\t\t     cells\n"
3030                        "       TX:\t\t\t%10u\n"
3031                        "       RX:\t\t\t%10u\n"
3032                        "       dropped:\t\t\t%10u\n"
3033                        "       CRC errors:\t\t%10u\n"
3034                        "       protocol errors:\t\t%10u\n\n"
3035                        "     CS  sublayer:\t\t      PDUs\n"
3036                        "       TX:\t\t\t%10u\n"
3037                        "       RX:\t\t\t%10u\n"
3038                        "       dropped:\t\t\t%10u\n"
3039                        "       protocol errors:\t\t%10u\n",
3040                        be32_to_cpu(fore200e->stats->aal34.cells_transmitted),
3041                        be32_to_cpu(fore200e->stats->aal34.cells_received),
3042                        be32_to_cpu(fore200e->stats->aal34.cells_dropped),
3043                        be32_to_cpu(fore200e->stats->aal34.cells_crc_errors),
3044                        be32_to_cpu(fore200e->stats->aal34.cells_protocol_errors),
3045                        be32_to_cpu(fore200e->stats->aal34.cspdus_transmitted),
3046                        be32_to_cpu(fore200e->stats->aal34.cspdus_received),
3047                        be32_to_cpu(fore200e->stats->aal34.cspdus_dropped),
3048                        be32_to_cpu(fore200e->stats->aal34.cspdus_protocol_errors));
3049     
3050     if (!left--)
3051         return sprintf(page,"\n"
3052                        "   AAL5:\n"
3053                        "     SAR sublayer:\t\t     cells\n"
3054                        "       TX:\t\t\t%10u\n"
3055                        "       RX:\t\t\t%10u\n"
3056                        "       dropped:\t\t\t%10u\n"
3057                        "       congestions:\t\t%10u\n\n"
3058                        "     CS  sublayer:\t\t      PDUs\n"
3059                        "       TX:\t\t\t%10u\n"
3060                        "       RX:\t\t\t%10u\n"
3061                        "       dropped:\t\t\t%10u\n"
3062                        "       CRC errors:\t\t%10u\n"
3063                        "       protocol errors:\t\t%10u\n",
3064                        be32_to_cpu(fore200e->stats->aal5.cells_transmitted),
3065                        be32_to_cpu(fore200e->stats->aal5.cells_received),
3066                        be32_to_cpu(fore200e->stats->aal5.cells_dropped),
3067                        be32_to_cpu(fore200e->stats->aal5.congestion_experienced),
3068                        be32_to_cpu(fore200e->stats->aal5.cspdus_transmitted),
3069                        be32_to_cpu(fore200e->stats->aal5.cspdus_received),
3070                        be32_to_cpu(fore200e->stats->aal5.cspdus_dropped),
3071                        be32_to_cpu(fore200e->stats->aal5.cspdus_crc_errors),
3072                        be32_to_cpu(fore200e->stats->aal5.cspdus_protocol_errors));
3073     
3074     if (!left--)
3075         return sprintf(page,"\n"
3076                        "   AUX:\t\t       allocation failures\n"
3077                        "     small b1:\t\t\t%10u\n"
3078                        "     large b1:\t\t\t%10u\n"
3079                        "     small b2:\t\t\t%10u\n"
3080                        "     large b2:\t\t\t%10u\n"
3081                        "     RX PDUs:\t\t\t%10u\n"
3082                        "     TX PDUs:\t\t\t%10lu\n",
3083                        be32_to_cpu(fore200e->stats->aux.small_b1_failed),
3084                        be32_to_cpu(fore200e->stats->aux.large_b1_failed),
3085                        be32_to_cpu(fore200e->stats->aux.small_b2_failed),
3086                        be32_to_cpu(fore200e->stats->aux.large_b2_failed),
3087                        be32_to_cpu(fore200e->stats->aux.rpd_alloc_failed),
3088                        fore200e->tx_sat);
3089     
3090     if (!left--)
3091         return sprintf(page,"\n"
3092                        " receive carrier:\t\t\t%s\n",
3093                        fore200e->stats->aux.receive_carrier ? "ON" : "OFF!");
3094     
3095     if (!left--) {
3096         return sprintf(page,"\n"
3097                        " VCCs:\n  address   VPI VCI   AAL "
3098                        "TX PDUs   TX min/max size  RX PDUs   RX min/max size\n");
3099     }
3100
3101     for (i = 0; i < NBR_CONNECT; i++) {
3102
3103         vcc = fore200e->vc_map[i].vcc;
3104
3105         if (vcc == NULL)
3106             continue;
3107
3108         spin_lock_irqsave(&fore200e->q_lock, flags);
3109
3110         if (vcc && test_bit(ATM_VF_READY, &vcc->flags) && !left--) {
3111
3112             fore200e_vcc = FORE200E_VCC(vcc);
3113             ASSERT(fore200e_vcc);
3114
3115             len = sprintf(page,
3116                           "  %08x  %03d %05d %1d   %09lu %05d/%05d      %09lu %05d/%05d\n",
3117                           (u32)(unsigned long)vcc,
3118                           vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal),
3119                           fore200e_vcc->tx_pdu,
3120                           fore200e_vcc->tx_min_pdu > 0xFFFF ? 0 : fore200e_vcc->tx_min_pdu,
3121                           fore200e_vcc->tx_max_pdu,
3122                           fore200e_vcc->rx_pdu,
3123                           fore200e_vcc->rx_min_pdu > 0xFFFF ? 0 : fore200e_vcc->rx_min_pdu,
3124                           fore200e_vcc->rx_max_pdu);
3125
3126             spin_unlock_irqrestore(&fore200e->q_lock, flags);
3127             return len;
3128         }
3129
3130         spin_unlock_irqrestore(&fore200e->q_lock, flags);
3131     }
3132     
3133     return 0;
3134 }
3135
3136 module_init(fore200e_module_init);
3137 module_exit(fore200e_module_cleanup);
3138
3139
3140 static const struct atmdev_ops fore200e_ops =
3141 {
3142         .open       = fore200e_open,
3143         .close      = fore200e_close,
3144         .ioctl      = fore200e_ioctl,
3145         .getsockopt = fore200e_getsockopt,
3146         .setsockopt = fore200e_setsockopt,
3147         .send       = fore200e_send,
3148         .change_qos = fore200e_change_qos,
3149         .proc_read  = fore200e_proc_read,
3150         .owner      = THIS_MODULE
3151 };
3152
3153
3154 static const struct fore200e_bus fore200e_bus[] = {
3155 #ifdef CONFIG_PCI
3156     { "PCA-200E", "pca200e", 32, 4, 32, 
3157       fore200e_pca_read,
3158       fore200e_pca_write,
3159       fore200e_pca_dma_map,
3160       fore200e_pca_dma_unmap,
3161       fore200e_pca_dma_sync_for_cpu,
3162       fore200e_pca_dma_sync_for_device,
3163       fore200e_pca_dma_chunk_alloc,
3164       fore200e_pca_dma_chunk_free,
3165       NULL,
3166       fore200e_pca_configure,
3167       fore200e_pca_map,
3168       fore200e_pca_reset,
3169       fore200e_pca_prom_read,
3170       fore200e_pca_unmap,
3171       NULL,
3172       fore200e_pca_irq_check,
3173       fore200e_pca_irq_ack,
3174       fore200e_pca_proc_read,
3175     },
3176 #endif
3177 #ifdef CONFIG_SBUS
3178     { "SBA-200E", "sba200e", 32, 64, 32,
3179       fore200e_sba_read,
3180       fore200e_sba_write,
3181       fore200e_sba_dma_map,
3182       fore200e_sba_dma_unmap,
3183       fore200e_sba_dma_sync_for_cpu,
3184       fore200e_sba_dma_sync_for_device,
3185       fore200e_sba_dma_chunk_alloc,
3186       fore200e_sba_dma_chunk_free,
3187       fore200e_sba_detect, 
3188       fore200e_sba_configure,
3189       fore200e_sba_map,
3190       fore200e_sba_reset,
3191       fore200e_sba_prom_read,
3192       fore200e_sba_unmap,
3193       fore200e_sba_irq_enable,
3194       fore200e_sba_irq_check,
3195       fore200e_sba_irq_ack,
3196       fore200e_sba_proc_read,
3197     },
3198 #endif
3199     {}
3200 };
3201
3202 #ifdef MODULE_LICENSE
3203 MODULE_LICENSE("GPL");
3204 #endif