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