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