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