[PATCH] uml: fix hang in TT mode on fault
[linux-2.6/zen-sources.git] / drivers / atm / fore200e.c
blob2bf723a7b6e62c12918b865cac2cf6c970d81736
1 /*
2 $Id: fore200e.c,v 1.5 2000/04/14 10:10:34 davem Exp $
4 A FORE Systems 200E-series driver for ATM on Linux.
5 Christophe Lizzi (lizzi@cnam.fr), October 1999-March 2003.
7 Based on the PCA-200E driver from Uwe Dannowski (Uwe.Dannowski@inf.tu-dresden.de).
9 This driver simultaneously supports PCA-200E and SBA-200E adapters
10 on i386, alpha (untested), powerpc, sparc and sparc64 architectures.
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #include <linux/config.h>
29 #include <linux/kernel.h>
30 #include <linux/slab.h>
31 #include <linux/init.h>
32 #include <linux/capability.h>
33 #include <linux/sched.h>
34 #include <linux/interrupt.h>
35 #include <linux/bitops.h>
36 #include <linux/pci.h>
37 #include <linux/module.h>
38 #include <linux/atmdev.h>
39 #include <linux/sonet.h>
40 #include <linux/atm_suni.h>
41 #include <linux/dma-mapping.h>
42 #include <linux/delay.h>
43 #include <asm/io.h>
44 #include <asm/string.h>
45 #include <asm/page.h>
46 #include <asm/irq.h>
47 #include <asm/dma.h>
48 #include <asm/byteorder.h>
49 #include <asm/uaccess.h>
50 #include <asm/atomic.h>
52 #ifdef CONFIG_ATM_FORE200E_SBA
53 #include <asm/idprom.h>
54 #include <asm/sbus.h>
55 #include <asm/openprom.h>
56 #include <asm/oplib.h>
57 #include <asm/pgtable.h>
58 #endif
60 #if defined(CONFIG_ATM_FORE200E_USE_TASKLET) /* defer interrupt work to a tasklet */
61 #define FORE200E_USE_TASKLET
62 #endif
64 #if 0 /* enable the debugging code of the buffer supply queues */
65 #define FORE200E_BSQ_DEBUG
66 #endif
68 #if 1 /* ensure correct handling of 52-byte AAL0 SDUs expected by atmdump-like apps */
69 #define FORE200E_52BYTE_AAL0_SDU
70 #endif
72 #include "fore200e.h"
73 #include "suni.h"
75 #define FORE200E_VERSION "0.3e"
77 #define FORE200E "fore200e: "
79 #if 0 /* override .config */
80 #define CONFIG_ATM_FORE200E_DEBUG 1
81 #endif
82 #if defined(CONFIG_ATM_FORE200E_DEBUG) && (CONFIG_ATM_FORE200E_DEBUG > 0)
83 #define DPRINTK(level, format, args...) do { if (CONFIG_ATM_FORE200E_DEBUG >= (level)) \
84 printk(FORE200E format, ##args); } while (0)
85 #else
86 #define DPRINTK(level, format, args...) do {} while (0)
87 #endif
90 #define FORE200E_ALIGN(addr, alignment) \
91 ((((unsigned long)(addr) + (alignment - 1)) & ~(alignment - 1)) - (unsigned long)(addr))
93 #define FORE200E_DMA_INDEX(dma_addr, type, index) ((dma_addr) + (index) * sizeof(type))
95 #define FORE200E_INDEX(virt_addr, type, index) (&((type *)(virt_addr))[ index ])
97 #define FORE200E_NEXT_ENTRY(index, modulo) (index = ++(index) % (modulo))
99 #if 1
100 #define ASSERT(expr) if (!(expr)) { \
101 printk(FORE200E "assertion failed! %s[%d]: %s\n", \
102 __FUNCTION__, __LINE__, #expr); \
103 panic(FORE200E "%s", __FUNCTION__); \
105 #else
106 #define ASSERT(expr) do {} while (0)
107 #endif
110 static const struct atmdev_ops fore200e_ops;
111 static const struct fore200e_bus fore200e_bus[];
113 static LIST_HEAD(fore200e_boards);
116 MODULE_AUTHOR("Christophe Lizzi - credits to Uwe Dannowski and Heikki Vatiainen");
117 MODULE_DESCRIPTION("FORE Systems 200E-series ATM driver - version " FORE200E_VERSION);
118 MODULE_SUPPORTED_DEVICE("PCA-200E, SBA-200E");
121 static const int fore200e_rx_buf_nbr[ BUFFER_SCHEME_NBR ][ BUFFER_MAGN_NBR ] = {
122 { BUFFER_S1_NBR, BUFFER_L1_NBR },
123 { BUFFER_S2_NBR, BUFFER_L2_NBR }
126 static const int fore200e_rx_buf_size[ BUFFER_SCHEME_NBR ][ BUFFER_MAGN_NBR ] = {
127 { BUFFER_S1_SIZE, BUFFER_L1_SIZE },
128 { BUFFER_S2_SIZE, BUFFER_L2_SIZE }
132 #if defined(CONFIG_ATM_FORE200E_DEBUG) && (CONFIG_ATM_FORE200E_DEBUG > 0)
133 static const char* fore200e_traffic_class[] = { "NONE", "UBR", "CBR", "VBR", "ABR", "ANY" };
134 #endif
137 #if 0 /* currently unused */
138 static int
139 fore200e_fore2atm_aal(enum fore200e_aal aal)
141 switch(aal) {
142 case FORE200E_AAL0: return ATM_AAL0;
143 case FORE200E_AAL34: return ATM_AAL34;
144 case FORE200E_AAL5: return ATM_AAL5;
147 return -EINVAL;
149 #endif
152 static enum fore200e_aal
153 fore200e_atm2fore_aal(int aal)
155 switch(aal) {
156 case ATM_AAL0: return FORE200E_AAL0;
157 case ATM_AAL34: return FORE200E_AAL34;
158 case ATM_AAL1:
159 case ATM_AAL2:
160 case ATM_AAL5: return FORE200E_AAL5;
163 return -EINVAL;
167 static char*
168 fore200e_irq_itoa(int irq)
170 #if defined(__sparc_v9__)
171 return __irq_itoa(irq);
172 #else
173 static char str[8];
174 sprintf(str, "%d", irq);
175 return str;
176 #endif
180 static void*
181 fore200e_kmalloc(int size, int flags)
183 void* chunk = kmalloc(size, flags);
185 if (chunk)
186 memset(chunk, 0x00, size);
187 else
188 printk(FORE200E "kmalloc() failed, requested size = %d, flags = 0x%x\n", size, flags);
190 return chunk;
194 static void
195 fore200e_kfree(void* chunk)
197 kfree(chunk);
201 /* allocate and align a chunk of memory intended to hold the data behing exchanged
202 between the driver and the adapter (using streaming DVMA) */
204 static int
205 fore200e_chunk_alloc(struct fore200e* fore200e, struct chunk* chunk, int size, int alignment, int direction)
207 unsigned long offset = 0;
209 if (alignment <= sizeof(int))
210 alignment = 0;
212 chunk->alloc_size = size + alignment;
213 chunk->align_size = size;
214 chunk->direction = direction;
216 chunk->alloc_addr = fore200e_kmalloc(chunk->alloc_size, GFP_KERNEL | GFP_DMA);
217 if (chunk->alloc_addr == NULL)
218 return -ENOMEM;
220 if (alignment > 0)
221 offset = FORE200E_ALIGN(chunk->alloc_addr, alignment);
223 chunk->align_addr = chunk->alloc_addr + offset;
225 chunk->dma_addr = fore200e->bus->dma_map(fore200e, chunk->align_addr, chunk->align_size, direction);
227 return 0;
231 /* free a chunk of memory */
233 static void
234 fore200e_chunk_free(struct fore200e* fore200e, struct chunk* chunk)
236 fore200e->bus->dma_unmap(fore200e, chunk->dma_addr, chunk->dma_size, chunk->direction);
238 fore200e_kfree(chunk->alloc_addr);
242 static void
243 fore200e_spin(int msecs)
245 unsigned long timeout = jiffies + msecs_to_jiffies(msecs);
246 while (time_before(jiffies, timeout));
250 static int
251 fore200e_poll(struct fore200e* fore200e, volatile u32* addr, u32 val, int msecs)
253 unsigned long timeout = jiffies + msecs_to_jiffies(msecs);
254 int ok;
256 mb();
257 do {
258 if ((ok = (*addr == val)) || (*addr & STATUS_ERROR))
259 break;
261 } while (time_before(jiffies, timeout));
263 #if 1
264 if (!ok) {
265 printk(FORE200E "cmd polling failed, got status 0x%08x, expected 0x%08x\n",
266 *addr, val);
268 #endif
270 return ok;
274 static int
275 fore200e_io_poll(struct fore200e* fore200e, volatile u32 __iomem *addr, u32 val, int msecs)
277 unsigned long timeout = jiffies + msecs_to_jiffies(msecs);
278 int ok;
280 do {
281 if ((ok = (fore200e->bus->read(addr) == val)))
282 break;
284 } while (time_before(jiffies, timeout));
286 #if 1
287 if (!ok) {
288 printk(FORE200E "I/O polling failed, got status 0x%08x, expected 0x%08x\n",
289 fore200e->bus->read(addr), val);
291 #endif
293 return ok;
297 static void
298 fore200e_free_rx_buf(struct fore200e* fore200e)
300 int scheme, magn, nbr;
301 struct buffer* buffer;
303 for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
304 for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
306 if ((buffer = fore200e->host_bsq[ scheme ][ magn ].buffer) != NULL) {
308 for (nbr = 0; nbr < fore200e_rx_buf_nbr[ scheme ][ magn ]; nbr++) {
310 struct chunk* data = &buffer[ nbr ].data;
312 if (data->alloc_addr != NULL)
313 fore200e_chunk_free(fore200e, data);
321 static void
322 fore200e_uninit_bs_queue(struct fore200e* fore200e)
324 int scheme, magn;
326 for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
327 for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
329 struct chunk* status = &fore200e->host_bsq[ scheme ][ magn ].status;
330 struct chunk* rbd_block = &fore200e->host_bsq[ scheme ][ magn ].rbd_block;
332 if (status->alloc_addr)
333 fore200e->bus->dma_chunk_free(fore200e, status);
335 if (rbd_block->alloc_addr)
336 fore200e->bus->dma_chunk_free(fore200e, rbd_block);
342 static int
343 fore200e_reset(struct fore200e* fore200e, int diag)
345 int ok;
347 fore200e->cp_monitor = fore200e->virt_base + FORE200E_CP_MONITOR_OFFSET;
349 fore200e->bus->write(BSTAT_COLD_START, &fore200e->cp_monitor->bstat);
351 fore200e->bus->reset(fore200e);
353 if (diag) {
354 ok = fore200e_io_poll(fore200e, &fore200e->cp_monitor->bstat, BSTAT_SELFTEST_OK, 1000);
355 if (ok == 0) {
357 printk(FORE200E "device %s self-test failed\n", fore200e->name);
358 return -ENODEV;
361 printk(FORE200E "device %s self-test passed\n", fore200e->name);
363 fore200e->state = FORE200E_STATE_RESET;
366 return 0;
370 static void
371 fore200e_shutdown(struct fore200e* fore200e)
373 printk(FORE200E "removing device %s at 0x%lx, IRQ %s\n",
374 fore200e->name, fore200e->phys_base,
375 fore200e_irq_itoa(fore200e->irq));
377 if (fore200e->state > FORE200E_STATE_RESET) {
378 /* first, reset the board to prevent further interrupts or data transfers */
379 fore200e_reset(fore200e, 0);
382 /* then, release all allocated resources */
383 switch(fore200e->state) {
385 case FORE200E_STATE_COMPLETE:
386 kfree(fore200e->stats);
388 case FORE200E_STATE_IRQ:
389 free_irq(fore200e->irq, fore200e->atm_dev);
391 case FORE200E_STATE_ALLOC_BUF:
392 fore200e_free_rx_buf(fore200e);
394 case FORE200E_STATE_INIT_BSQ:
395 fore200e_uninit_bs_queue(fore200e);
397 case FORE200E_STATE_INIT_RXQ:
398 fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_rxq.status);
399 fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_rxq.rpd);
401 case FORE200E_STATE_INIT_TXQ:
402 fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_txq.status);
403 fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_txq.tpd);
405 case FORE200E_STATE_INIT_CMDQ:
406 fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_cmdq.status);
408 case FORE200E_STATE_INITIALIZE:
409 /* nothing to do for that state */
411 case FORE200E_STATE_START_FW:
412 /* nothing to do for that state */
414 case FORE200E_STATE_LOAD_FW:
415 /* nothing to do for that state */
417 case FORE200E_STATE_RESET:
418 /* nothing to do for that state */
420 case FORE200E_STATE_MAP:
421 fore200e->bus->unmap(fore200e);
423 case FORE200E_STATE_CONFIGURE:
424 /* nothing to do for that state */
426 case FORE200E_STATE_REGISTER:
427 /* XXX shouldn't we *start* by deregistering the device? */
428 atm_dev_deregister(fore200e->atm_dev);
430 case FORE200E_STATE_BLANK:
431 /* nothing to do for that state */
432 break;
437 #ifdef CONFIG_ATM_FORE200E_PCA
439 static u32 fore200e_pca_read(volatile u32 __iomem *addr)
441 /* on big-endian hosts, the board is configured to convert
442 the endianess of slave RAM accesses */
443 return le32_to_cpu(readl(addr));
447 static void fore200e_pca_write(u32 val, volatile u32 __iomem *addr)
449 /* on big-endian hosts, the board is configured to convert
450 the endianess of slave RAM accesses */
451 writel(cpu_to_le32(val), addr);
455 static u32
456 fore200e_pca_dma_map(struct fore200e* fore200e, void* virt_addr, int size, int direction)
458 u32 dma_addr = pci_map_single((struct pci_dev*)fore200e->bus_dev, virt_addr, size, direction);
460 DPRINTK(3, "PCI DVMA mapping: virt_addr = 0x%p, size = %d, direction = %d, --> dma_addr = 0x%08x\n",
461 virt_addr, size, direction, dma_addr);
463 return dma_addr;
467 static void
468 fore200e_pca_dma_unmap(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
470 DPRINTK(3, "PCI DVMA unmapping: dma_addr = 0x%08x, size = %d, direction = %d\n",
471 dma_addr, size, direction);
473 pci_unmap_single((struct pci_dev*)fore200e->bus_dev, dma_addr, size, direction);
477 static void
478 fore200e_pca_dma_sync_for_cpu(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
480 DPRINTK(3, "PCI DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction);
482 pci_dma_sync_single_for_cpu((struct pci_dev*)fore200e->bus_dev, dma_addr, size, direction);
485 static void
486 fore200e_pca_dma_sync_for_device(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
488 DPRINTK(3, "PCI DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction);
490 pci_dma_sync_single_for_device((struct pci_dev*)fore200e->bus_dev, dma_addr, size, direction);
494 /* allocate a DMA consistent chunk of memory intended to act as a communication mechanism
495 (to hold descriptors, status, queues, etc.) shared by the driver and the adapter */
497 static int
498 fore200e_pca_dma_chunk_alloc(struct fore200e* fore200e, struct chunk* chunk,
499 int size, int nbr, int alignment)
501 /* returned chunks are page-aligned */
502 chunk->alloc_size = size * nbr;
503 chunk->alloc_addr = pci_alloc_consistent((struct pci_dev*)fore200e->bus_dev,
504 chunk->alloc_size,
505 &chunk->dma_addr);
507 if ((chunk->alloc_addr == NULL) || (chunk->dma_addr == 0))
508 return -ENOMEM;
510 chunk->align_addr = chunk->alloc_addr;
512 return 0;
516 /* free a DMA consistent chunk of memory */
518 static void
519 fore200e_pca_dma_chunk_free(struct fore200e* fore200e, struct chunk* chunk)
521 pci_free_consistent((struct pci_dev*)fore200e->bus_dev,
522 chunk->alloc_size,
523 chunk->alloc_addr,
524 chunk->dma_addr);
528 static int
529 fore200e_pca_irq_check(struct fore200e* fore200e)
531 /* this is a 1 bit register */
532 int irq_posted = readl(fore200e->regs.pca.psr);
534 #if defined(CONFIG_ATM_FORE200E_DEBUG) && (CONFIG_ATM_FORE200E_DEBUG == 2)
535 if (irq_posted && (readl(fore200e->regs.pca.hcr) & PCA200E_HCR_OUTFULL)) {
536 DPRINTK(2,"FIFO OUT full, device %d\n", fore200e->atm_dev->number);
538 #endif
540 return irq_posted;
544 static void
545 fore200e_pca_irq_ack(struct fore200e* fore200e)
547 writel(PCA200E_HCR_CLRINTR, fore200e->regs.pca.hcr);
551 static void
552 fore200e_pca_reset(struct fore200e* fore200e)
554 writel(PCA200E_HCR_RESET, fore200e->regs.pca.hcr);
555 fore200e_spin(10);
556 writel(0, fore200e->regs.pca.hcr);
560 static int __init
561 fore200e_pca_map(struct fore200e* fore200e)
563 DPRINTK(2, "device %s being mapped in memory\n", fore200e->name);
565 fore200e->virt_base = ioremap(fore200e->phys_base, PCA200E_IOSPACE_LENGTH);
567 if (fore200e->virt_base == NULL) {
568 printk(FORE200E "can't map device %s\n", fore200e->name);
569 return -EFAULT;
572 DPRINTK(1, "device %s mapped to 0x%p\n", fore200e->name, fore200e->virt_base);
574 /* gain access to the PCA specific registers */
575 fore200e->regs.pca.hcr = fore200e->virt_base + PCA200E_HCR_OFFSET;
576 fore200e->regs.pca.imr = fore200e->virt_base + PCA200E_IMR_OFFSET;
577 fore200e->regs.pca.psr = fore200e->virt_base + PCA200E_PSR_OFFSET;
579 fore200e->state = FORE200E_STATE_MAP;
580 return 0;
584 static void
585 fore200e_pca_unmap(struct fore200e* fore200e)
587 DPRINTK(2, "device %s being unmapped from memory\n", fore200e->name);
589 if (fore200e->virt_base != NULL)
590 iounmap(fore200e->virt_base);
594 static int __init
595 fore200e_pca_configure(struct fore200e* fore200e)
597 struct pci_dev* pci_dev = (struct pci_dev*)fore200e->bus_dev;
598 u8 master_ctrl, latency;
600 DPRINTK(2, "device %s being configured\n", fore200e->name);
602 if ((pci_dev->irq == 0) || (pci_dev->irq == 0xFF)) {
603 printk(FORE200E "incorrect IRQ setting - misconfigured PCI-PCI bridge?\n");
604 return -EIO;
607 pci_read_config_byte(pci_dev, PCA200E_PCI_MASTER_CTRL, &master_ctrl);
609 master_ctrl = master_ctrl
610 #if defined(__BIG_ENDIAN)
611 /* request the PCA board to convert the endianess of slave RAM accesses */
612 | PCA200E_CTRL_CONVERT_ENDIAN
613 #endif
614 #if 0
615 | PCA200E_CTRL_DIS_CACHE_RD
616 | PCA200E_CTRL_DIS_WRT_INVAL
617 | PCA200E_CTRL_ENA_CONT_REQ_MODE
618 | PCA200E_CTRL_2_CACHE_WRT_INVAL
619 #endif
620 | PCA200E_CTRL_LARGE_PCI_BURSTS;
622 pci_write_config_byte(pci_dev, PCA200E_PCI_MASTER_CTRL, master_ctrl);
624 /* raise latency from 32 (default) to 192, as this seems to prevent NIC
625 lockups (under heavy rx loads) due to continuous 'FIFO OUT full' condition.
626 this may impact the performances of other PCI devices on the same bus, though */
627 latency = 192;
628 pci_write_config_byte(pci_dev, PCI_LATENCY_TIMER, latency);
630 fore200e->state = FORE200E_STATE_CONFIGURE;
631 return 0;
635 static int __init
636 fore200e_pca_prom_read(struct fore200e* fore200e, struct prom_data* prom)
638 struct host_cmdq* cmdq = &fore200e->host_cmdq;
639 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
640 struct prom_opcode opcode;
641 int ok;
642 u32 prom_dma;
644 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
646 opcode.opcode = OPCODE_GET_PROM;
647 opcode.pad = 0;
649 prom_dma = fore200e->bus->dma_map(fore200e, prom, sizeof(struct prom_data), DMA_FROM_DEVICE);
651 fore200e->bus->write(prom_dma, &entry->cp_entry->cmd.prom_block.prom_haddr);
653 *entry->status = STATUS_PENDING;
655 fore200e->bus->write(*(u32*)&opcode, (u32 __iomem *)&entry->cp_entry->cmd.prom_block.opcode);
657 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
659 *entry->status = STATUS_FREE;
661 fore200e->bus->dma_unmap(fore200e, prom_dma, sizeof(struct prom_data), DMA_FROM_DEVICE);
663 if (ok == 0) {
664 printk(FORE200E "unable to get PROM data from device %s\n", fore200e->name);
665 return -EIO;
668 #if defined(__BIG_ENDIAN)
670 #define swap_here(addr) (*((u32*)(addr)) = swab32( *((u32*)(addr)) ))
672 /* MAC address is stored as little-endian */
673 swap_here(&prom->mac_addr[0]);
674 swap_here(&prom->mac_addr[4]);
675 #endif
677 return 0;
681 static int
682 fore200e_pca_proc_read(struct fore200e* fore200e, char *page)
684 struct pci_dev* pci_dev = (struct pci_dev*)fore200e->bus_dev;
686 return sprintf(page, " PCI bus/slot/function:\t%d/%d/%d\n",
687 pci_dev->bus->number, PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn));
690 #endif /* CONFIG_ATM_FORE200E_PCA */
693 #ifdef CONFIG_ATM_FORE200E_SBA
695 static u32
696 fore200e_sba_read(volatile u32 __iomem *addr)
698 return sbus_readl(addr);
702 static void
703 fore200e_sba_write(u32 val, volatile u32 __iomem *addr)
705 sbus_writel(val, addr);
709 static u32
710 fore200e_sba_dma_map(struct fore200e* fore200e, void* virt_addr, int size, int direction)
712 u32 dma_addr = sbus_map_single((struct sbus_dev*)fore200e->bus_dev, virt_addr, size, direction);
714 DPRINTK(3, "SBUS DVMA mapping: virt_addr = 0x%p, size = %d, direction = %d --> dma_addr = 0x%08x\n",
715 virt_addr, size, direction, dma_addr);
717 return dma_addr;
721 static void
722 fore200e_sba_dma_unmap(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
724 DPRINTK(3, "SBUS DVMA unmapping: dma_addr = 0x%08x, size = %d, direction = %d,\n",
725 dma_addr, size, direction);
727 sbus_unmap_single((struct sbus_dev*)fore200e->bus_dev, dma_addr, size, direction);
731 static void
732 fore200e_sba_dma_sync_for_cpu(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
734 DPRINTK(3, "SBUS DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction);
736 sbus_dma_sync_single_for_cpu((struct sbus_dev*)fore200e->bus_dev, dma_addr, size, direction);
739 static void
740 fore200e_sba_dma_sync_for_device(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
742 DPRINTK(3, "SBUS DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction);
744 sbus_dma_sync_single_for_device((struct sbus_dev*)fore200e->bus_dev, dma_addr, size, direction);
748 /* allocate a DVMA consistent chunk of memory intended to act as a communication mechanism
749 (to hold descriptors, status, queues, etc.) shared by the driver and the adapter */
751 static int
752 fore200e_sba_dma_chunk_alloc(struct fore200e* fore200e, struct chunk* chunk,
753 int size, int nbr, int alignment)
755 chunk->alloc_size = chunk->align_size = size * nbr;
757 /* returned chunks are page-aligned */
758 chunk->alloc_addr = sbus_alloc_consistent((struct sbus_dev*)fore200e->bus_dev,
759 chunk->alloc_size,
760 &chunk->dma_addr);
762 if ((chunk->alloc_addr == NULL) || (chunk->dma_addr == 0))
763 return -ENOMEM;
765 chunk->align_addr = chunk->alloc_addr;
767 return 0;
771 /* free a DVMA consistent chunk of memory */
773 static void
774 fore200e_sba_dma_chunk_free(struct fore200e* fore200e, struct chunk* chunk)
776 sbus_free_consistent((struct sbus_dev*)fore200e->bus_dev,
777 chunk->alloc_size,
778 chunk->alloc_addr,
779 chunk->dma_addr);
783 static void
784 fore200e_sba_irq_enable(struct fore200e* fore200e)
786 u32 hcr = fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_STICKY;
787 fore200e->bus->write(hcr | SBA200E_HCR_INTR_ENA, fore200e->regs.sba.hcr);
791 static int
792 fore200e_sba_irq_check(struct fore200e* fore200e)
794 return fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_INTR_REQ;
798 static void
799 fore200e_sba_irq_ack(struct fore200e* fore200e)
801 u32 hcr = fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_STICKY;
802 fore200e->bus->write(hcr | SBA200E_HCR_INTR_CLR, fore200e->regs.sba.hcr);
806 static void
807 fore200e_sba_reset(struct fore200e* fore200e)
809 fore200e->bus->write(SBA200E_HCR_RESET, fore200e->regs.sba.hcr);
810 fore200e_spin(10);
811 fore200e->bus->write(0, fore200e->regs.sba.hcr);
815 static int __init
816 fore200e_sba_map(struct fore200e* fore200e)
818 struct sbus_dev* sbus_dev = (struct sbus_dev*)fore200e->bus_dev;
819 unsigned int bursts;
821 /* gain access to the SBA specific registers */
822 fore200e->regs.sba.hcr = sbus_ioremap(&sbus_dev->resource[0], 0, SBA200E_HCR_LENGTH, "SBA HCR");
823 fore200e->regs.sba.bsr = sbus_ioremap(&sbus_dev->resource[1], 0, SBA200E_BSR_LENGTH, "SBA BSR");
824 fore200e->regs.sba.isr = sbus_ioremap(&sbus_dev->resource[2], 0, SBA200E_ISR_LENGTH, "SBA ISR");
825 fore200e->virt_base = sbus_ioremap(&sbus_dev->resource[3], 0, SBA200E_RAM_LENGTH, "SBA RAM");
827 if (fore200e->virt_base == NULL) {
828 printk(FORE200E "unable to map RAM of device %s\n", fore200e->name);
829 return -EFAULT;
832 DPRINTK(1, "device %s mapped to 0x%p\n", fore200e->name, fore200e->virt_base);
834 fore200e->bus->write(0x02, fore200e->regs.sba.isr); /* XXX hardwired interrupt level */
836 /* get the supported DVMA burst sizes */
837 bursts = prom_getintdefault(sbus_dev->bus->prom_node, "burst-sizes", 0x00);
839 if (sbus_can_dma_64bit(sbus_dev))
840 sbus_set_sbus64(sbus_dev, bursts);
842 fore200e->state = FORE200E_STATE_MAP;
843 return 0;
847 static void
848 fore200e_sba_unmap(struct fore200e* fore200e)
850 sbus_iounmap(fore200e->regs.sba.hcr, SBA200E_HCR_LENGTH);
851 sbus_iounmap(fore200e->regs.sba.bsr, SBA200E_BSR_LENGTH);
852 sbus_iounmap(fore200e->regs.sba.isr, SBA200E_ISR_LENGTH);
853 sbus_iounmap(fore200e->virt_base, SBA200E_RAM_LENGTH);
857 static int __init
858 fore200e_sba_configure(struct fore200e* fore200e)
860 fore200e->state = FORE200E_STATE_CONFIGURE;
861 return 0;
865 static struct fore200e* __init
866 fore200e_sba_detect(const struct fore200e_bus* bus, int index)
868 struct fore200e* fore200e;
869 struct sbus_bus* sbus_bus;
870 struct sbus_dev* sbus_dev = NULL;
872 unsigned int count = 0;
874 for_each_sbus (sbus_bus) {
875 for_each_sbusdev (sbus_dev, sbus_bus) {
876 if (strcmp(sbus_dev->prom_name, SBA200E_PROM_NAME) == 0) {
877 if (count >= index)
878 goto found;
879 count++;
883 return NULL;
885 found:
886 if (sbus_dev->num_registers != 4) {
887 printk(FORE200E "this %s device has %d instead of 4 registers\n",
888 bus->model_name, sbus_dev->num_registers);
889 return NULL;
892 fore200e = fore200e_kmalloc(sizeof(struct fore200e), GFP_KERNEL);
893 if (fore200e == NULL)
894 return NULL;
896 fore200e->bus = bus;
897 fore200e->bus_dev = sbus_dev;
898 fore200e->irq = sbus_dev->irqs[ 0 ];
900 fore200e->phys_base = (unsigned long)sbus_dev;
902 sprintf(fore200e->name, "%s-%d", bus->model_name, index - 1);
904 return fore200e;
908 static int __init
909 fore200e_sba_prom_read(struct fore200e* fore200e, struct prom_data* prom)
911 struct sbus_dev* sbus_dev = (struct sbus_dev*) fore200e->bus_dev;
912 int len;
914 len = prom_getproperty(sbus_dev->prom_node, "macaddrlo2", &prom->mac_addr[ 4 ], 4);
915 if (len < 0)
916 return -EBUSY;
918 len = prom_getproperty(sbus_dev->prom_node, "macaddrhi4", &prom->mac_addr[ 2 ], 4);
919 if (len < 0)
920 return -EBUSY;
922 prom_getproperty(sbus_dev->prom_node, "serialnumber",
923 (char*)&prom->serial_number, sizeof(prom->serial_number));
925 prom_getproperty(sbus_dev->prom_node, "promversion",
926 (char*)&prom->hw_revision, sizeof(prom->hw_revision));
928 return 0;
932 static int
933 fore200e_sba_proc_read(struct fore200e* fore200e, char *page)
935 struct sbus_dev* sbus_dev = (struct sbus_dev*)fore200e->bus_dev;
937 return sprintf(page, " SBUS slot/device:\t\t%d/'%s'\n", sbus_dev->slot, sbus_dev->prom_name);
939 #endif /* CONFIG_ATM_FORE200E_SBA */
942 static void
943 fore200e_tx_irq(struct fore200e* fore200e)
945 struct host_txq* txq = &fore200e->host_txq;
946 struct host_txq_entry* entry;
947 struct atm_vcc* vcc;
948 struct fore200e_vc_map* vc_map;
950 if (fore200e->host_txq.txing == 0)
951 return;
953 for (;;) {
955 entry = &txq->host_entry[ txq->tail ];
957 if ((*entry->status & STATUS_COMPLETE) == 0) {
958 break;
961 DPRINTK(3, "TX COMPLETED: entry = %p [tail = %d], vc_map = %p, skb = %p\n",
962 entry, txq->tail, entry->vc_map, entry->skb);
964 /* free copy of misaligned data */
965 kfree(entry->data);
967 /* remove DMA mapping */
968 fore200e->bus->dma_unmap(fore200e, entry->tpd->tsd[ 0 ].buffer, entry->tpd->tsd[ 0 ].length,
969 DMA_TO_DEVICE);
971 vc_map = entry->vc_map;
973 /* vcc closed since the time the entry was submitted for tx? */
974 if ((vc_map->vcc == NULL) ||
975 (test_bit(ATM_VF_READY, &vc_map->vcc->flags) == 0)) {
977 DPRINTK(1, "no ready vcc found for PDU sent on device %d\n",
978 fore200e->atm_dev->number);
980 dev_kfree_skb_any(entry->skb);
982 else {
983 ASSERT(vc_map->vcc);
985 /* vcc closed then immediately re-opened? */
986 if (vc_map->incarn != entry->incarn) {
988 /* when a vcc is closed, some PDUs may be still pending in the tx queue.
989 if the same vcc is immediately re-opened, those pending PDUs must
990 not be popped after the completion of their emission, as they refer
991 to the prior incarnation of that vcc. otherwise, sk_atm(vcc)->sk_wmem_alloc
992 would be decremented by the size of the (unrelated) skb, possibly
993 leading to a negative sk->sk_wmem_alloc count, ultimately freezing the vcc.
994 we thus bind the tx entry to the current incarnation of the vcc
995 when the entry is submitted for tx. When the tx later completes,
996 if the incarnation number of the tx entry does not match the one
997 of the vcc, then this implies that the vcc has been closed then re-opened.
998 we thus just drop the skb here. */
1000 DPRINTK(1, "vcc closed-then-re-opened; dropping PDU sent on device %d\n",
1001 fore200e->atm_dev->number);
1003 dev_kfree_skb_any(entry->skb);
1005 else {
1006 vcc = vc_map->vcc;
1007 ASSERT(vcc);
1009 /* notify tx completion */
1010 if (vcc->pop) {
1011 vcc->pop(vcc, entry->skb);
1013 else {
1014 dev_kfree_skb_any(entry->skb);
1016 #if 1
1017 /* race fixed by the above incarnation mechanism, but... */
1018 if (atomic_read(&sk_atm(vcc)->sk_wmem_alloc) < 0) {
1019 atomic_set(&sk_atm(vcc)->sk_wmem_alloc, 0);
1021 #endif
1022 /* check error condition */
1023 if (*entry->status & STATUS_ERROR)
1024 atomic_inc(&vcc->stats->tx_err);
1025 else
1026 atomic_inc(&vcc->stats->tx);
1030 *entry->status = STATUS_FREE;
1032 fore200e->host_txq.txing--;
1034 FORE200E_NEXT_ENTRY(txq->tail, QUEUE_SIZE_TX);
1039 #ifdef FORE200E_BSQ_DEBUG
1040 int bsq_audit(int where, struct host_bsq* bsq, int scheme, int magn)
1042 struct buffer* buffer;
1043 int count = 0;
1045 buffer = bsq->freebuf;
1046 while (buffer) {
1048 if (buffer->supplied) {
1049 printk(FORE200E "bsq_audit(%d): queue %d.%d, buffer %ld supplied but in free list!\n",
1050 where, scheme, magn, buffer->index);
1053 if (buffer->magn != magn) {
1054 printk(FORE200E "bsq_audit(%d): queue %d.%d, buffer %ld, unexpected magn = %d\n",
1055 where, scheme, magn, buffer->index, buffer->magn);
1058 if (buffer->scheme != scheme) {
1059 printk(FORE200E "bsq_audit(%d): queue %d.%d, buffer %ld, unexpected scheme = %d\n",
1060 where, scheme, magn, buffer->index, buffer->scheme);
1063 if ((buffer->index < 0) || (buffer->index >= fore200e_rx_buf_nbr[ scheme ][ magn ])) {
1064 printk(FORE200E "bsq_audit(%d): queue %d.%d, out of range buffer index = %ld !\n",
1065 where, scheme, magn, buffer->index);
1068 count++;
1069 buffer = buffer->next;
1072 if (count != bsq->freebuf_count) {
1073 printk(FORE200E "bsq_audit(%d): queue %d.%d, %d bufs in free list, but freebuf_count = %d\n",
1074 where, scheme, magn, count, bsq->freebuf_count);
1076 return 0;
1078 #endif
1081 static void
1082 fore200e_supply(struct fore200e* fore200e)
1084 int scheme, magn, i;
1086 struct host_bsq* bsq;
1087 struct host_bsq_entry* entry;
1088 struct buffer* buffer;
1090 for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
1091 for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
1093 bsq = &fore200e->host_bsq[ scheme ][ magn ];
1095 #ifdef FORE200E_BSQ_DEBUG
1096 bsq_audit(1, bsq, scheme, magn);
1097 #endif
1098 while (bsq->freebuf_count >= RBD_BLK_SIZE) {
1100 DPRINTK(2, "supplying %d rx buffers to queue %d / %d, freebuf_count = %d\n",
1101 RBD_BLK_SIZE, scheme, magn, bsq->freebuf_count);
1103 entry = &bsq->host_entry[ bsq->head ];
1105 for (i = 0; i < RBD_BLK_SIZE; i++) {
1107 /* take the first buffer in the free buffer list */
1108 buffer = bsq->freebuf;
1109 if (!buffer) {
1110 printk(FORE200E "no more free bufs in queue %d.%d, but freebuf_count = %d\n",
1111 scheme, magn, bsq->freebuf_count);
1112 return;
1114 bsq->freebuf = buffer->next;
1116 #ifdef FORE200E_BSQ_DEBUG
1117 if (buffer->supplied)
1118 printk(FORE200E "queue %d.%d, buffer %lu already supplied\n",
1119 scheme, magn, buffer->index);
1120 buffer->supplied = 1;
1121 #endif
1122 entry->rbd_block->rbd[ i ].buffer_haddr = buffer->data.dma_addr;
1123 entry->rbd_block->rbd[ i ].handle = FORE200E_BUF2HDL(buffer);
1126 FORE200E_NEXT_ENTRY(bsq->head, QUEUE_SIZE_BS);
1128 /* decrease accordingly the number of free rx buffers */
1129 bsq->freebuf_count -= RBD_BLK_SIZE;
1131 *entry->status = STATUS_PENDING;
1132 fore200e->bus->write(entry->rbd_block_dma, &entry->cp_entry->rbd_block_haddr);
1139 static int
1140 fore200e_push_rpd(struct fore200e* fore200e, struct atm_vcc* vcc, struct rpd* rpd)
1142 struct sk_buff* skb;
1143 struct buffer* buffer;
1144 struct fore200e_vcc* fore200e_vcc;
1145 int i, pdu_len = 0;
1146 #ifdef FORE200E_52BYTE_AAL0_SDU
1147 u32 cell_header = 0;
1148 #endif
1150 ASSERT(vcc);
1152 fore200e_vcc = FORE200E_VCC(vcc);
1153 ASSERT(fore200e_vcc);
1155 #ifdef FORE200E_52BYTE_AAL0_SDU
1156 if ((vcc->qos.aal == ATM_AAL0) && (vcc->qos.rxtp.max_sdu == ATM_AAL0_SDU)) {
1158 cell_header = (rpd->atm_header.gfc << ATM_HDR_GFC_SHIFT) |
1159 (rpd->atm_header.vpi << ATM_HDR_VPI_SHIFT) |
1160 (rpd->atm_header.vci << ATM_HDR_VCI_SHIFT) |
1161 (rpd->atm_header.plt << ATM_HDR_PTI_SHIFT) |
1162 rpd->atm_header.clp;
1163 pdu_len = 4;
1165 #endif
1167 /* compute total PDU length */
1168 for (i = 0; i < rpd->nseg; i++)
1169 pdu_len += rpd->rsd[ i ].length;
1171 skb = alloc_skb(pdu_len, GFP_ATOMIC);
1172 if (skb == NULL) {
1173 DPRINTK(2, "unable to alloc new skb, rx PDU length = %d\n", pdu_len);
1175 atomic_inc(&vcc->stats->rx_drop);
1176 return -ENOMEM;
1179 __net_timestamp(skb);
1181 #ifdef FORE200E_52BYTE_AAL0_SDU
1182 if (cell_header) {
1183 *((u32*)skb_put(skb, 4)) = cell_header;
1185 #endif
1187 /* reassemble segments */
1188 for (i = 0; i < rpd->nseg; i++) {
1190 /* rebuild rx buffer address from rsd handle */
1191 buffer = FORE200E_HDL2BUF(rpd->rsd[ i ].handle);
1193 /* Make device DMA transfer visible to CPU. */
1194 fore200e->bus->dma_sync_for_cpu(fore200e, buffer->data.dma_addr, rpd->rsd[ i ].length, DMA_FROM_DEVICE);
1196 memcpy(skb_put(skb, rpd->rsd[ i ].length), buffer->data.align_addr, rpd->rsd[ i ].length);
1198 /* Now let the device get at it again. */
1199 fore200e->bus->dma_sync_for_device(fore200e, buffer->data.dma_addr, rpd->rsd[ i ].length, DMA_FROM_DEVICE);
1202 DPRINTK(3, "rx skb: len = %d, truesize = %d\n", skb->len, skb->truesize);
1204 if (pdu_len < fore200e_vcc->rx_min_pdu)
1205 fore200e_vcc->rx_min_pdu = pdu_len;
1206 if (pdu_len > fore200e_vcc->rx_max_pdu)
1207 fore200e_vcc->rx_max_pdu = pdu_len;
1208 fore200e_vcc->rx_pdu++;
1210 /* push PDU */
1211 if (atm_charge(vcc, skb->truesize) == 0) {
1213 DPRINTK(2, "receive buffers saturated for %d.%d.%d - PDU dropped\n",
1214 vcc->itf, vcc->vpi, vcc->vci);
1216 dev_kfree_skb_any(skb);
1218 atomic_inc(&vcc->stats->rx_drop);
1219 return -ENOMEM;
1222 ASSERT(atomic_read(&sk_atm(vcc)->sk_wmem_alloc) >= 0);
1224 vcc->push(vcc, skb);
1225 atomic_inc(&vcc->stats->rx);
1227 ASSERT(atomic_read(&sk_atm(vcc)->sk_wmem_alloc) >= 0);
1229 return 0;
1233 static void
1234 fore200e_collect_rpd(struct fore200e* fore200e, struct rpd* rpd)
1236 struct host_bsq* bsq;
1237 struct buffer* buffer;
1238 int i;
1240 for (i = 0; i < rpd->nseg; i++) {
1242 /* rebuild rx buffer address from rsd handle */
1243 buffer = FORE200E_HDL2BUF(rpd->rsd[ i ].handle);
1245 bsq = &fore200e->host_bsq[ buffer->scheme ][ buffer->magn ];
1247 #ifdef FORE200E_BSQ_DEBUG
1248 bsq_audit(2, bsq, buffer->scheme, buffer->magn);
1250 if (buffer->supplied == 0)
1251 printk(FORE200E "queue %d.%d, buffer %ld was not supplied\n",
1252 buffer->scheme, buffer->magn, buffer->index);
1253 buffer->supplied = 0;
1254 #endif
1256 /* re-insert the buffer into the free buffer list */
1257 buffer->next = bsq->freebuf;
1258 bsq->freebuf = buffer;
1260 /* then increment the number of free rx buffers */
1261 bsq->freebuf_count++;
1266 static void
1267 fore200e_rx_irq(struct fore200e* fore200e)
1269 struct host_rxq* rxq = &fore200e->host_rxq;
1270 struct host_rxq_entry* entry;
1271 struct atm_vcc* vcc;
1272 struct fore200e_vc_map* vc_map;
1274 for (;;) {
1276 entry = &rxq->host_entry[ rxq->head ];
1278 /* no more received PDUs */
1279 if ((*entry->status & STATUS_COMPLETE) == 0)
1280 break;
1282 vc_map = FORE200E_VC_MAP(fore200e, entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci);
1284 if ((vc_map->vcc == NULL) ||
1285 (test_bit(ATM_VF_READY, &vc_map->vcc->flags) == 0)) {
1287 DPRINTK(1, "no ready VC found for PDU received on %d.%d.%d\n",
1288 fore200e->atm_dev->number,
1289 entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci);
1291 else {
1292 vcc = vc_map->vcc;
1293 ASSERT(vcc);
1295 if ((*entry->status & STATUS_ERROR) == 0) {
1297 fore200e_push_rpd(fore200e, vcc, entry->rpd);
1299 else {
1300 DPRINTK(2, "damaged PDU on %d.%d.%d\n",
1301 fore200e->atm_dev->number,
1302 entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci);
1303 atomic_inc(&vcc->stats->rx_err);
1307 FORE200E_NEXT_ENTRY(rxq->head, QUEUE_SIZE_RX);
1309 fore200e_collect_rpd(fore200e, entry->rpd);
1311 /* rewrite the rpd address to ack the received PDU */
1312 fore200e->bus->write(entry->rpd_dma, &entry->cp_entry->rpd_haddr);
1313 *entry->status = STATUS_FREE;
1315 fore200e_supply(fore200e);
1320 #ifndef FORE200E_USE_TASKLET
1321 static void
1322 fore200e_irq(struct fore200e* fore200e)
1324 unsigned long flags;
1326 spin_lock_irqsave(&fore200e->q_lock, flags);
1327 fore200e_rx_irq(fore200e);
1328 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1330 spin_lock_irqsave(&fore200e->q_lock, flags);
1331 fore200e_tx_irq(fore200e);
1332 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1334 #endif
1337 static irqreturn_t
1338 fore200e_interrupt(int irq, void* dev, struct pt_regs* regs)
1340 struct fore200e* fore200e = FORE200E_DEV((struct atm_dev*)dev);
1342 if (fore200e->bus->irq_check(fore200e) == 0) {
1344 DPRINTK(3, "interrupt NOT triggered by device %d\n", fore200e->atm_dev->number);
1345 return IRQ_NONE;
1347 DPRINTK(3, "interrupt triggered by device %d\n", fore200e->atm_dev->number);
1349 #ifdef FORE200E_USE_TASKLET
1350 tasklet_schedule(&fore200e->tx_tasklet);
1351 tasklet_schedule(&fore200e->rx_tasklet);
1352 #else
1353 fore200e_irq(fore200e);
1354 #endif
1356 fore200e->bus->irq_ack(fore200e);
1357 return IRQ_HANDLED;
1361 #ifdef FORE200E_USE_TASKLET
1362 static void
1363 fore200e_tx_tasklet(unsigned long data)
1365 struct fore200e* fore200e = (struct fore200e*) data;
1366 unsigned long flags;
1368 DPRINTK(3, "tx tasklet scheduled for device %d\n", fore200e->atm_dev->number);
1370 spin_lock_irqsave(&fore200e->q_lock, flags);
1371 fore200e_tx_irq(fore200e);
1372 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1376 static void
1377 fore200e_rx_tasklet(unsigned long data)
1379 struct fore200e* fore200e = (struct fore200e*) data;
1380 unsigned long flags;
1382 DPRINTK(3, "rx tasklet scheduled for device %d\n", fore200e->atm_dev->number);
1384 spin_lock_irqsave(&fore200e->q_lock, flags);
1385 fore200e_rx_irq((struct fore200e*) data);
1386 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1388 #endif
1391 static int
1392 fore200e_select_scheme(struct atm_vcc* vcc)
1394 /* fairly balance the VCs over (identical) buffer schemes */
1395 int scheme = vcc->vci % 2 ? BUFFER_SCHEME_ONE : BUFFER_SCHEME_TWO;
1397 DPRINTK(1, "VC %d.%d.%d uses buffer scheme %d\n",
1398 vcc->itf, vcc->vpi, vcc->vci, scheme);
1400 return scheme;
1404 static int
1405 fore200e_activate_vcin(struct fore200e* fore200e, int activate, struct atm_vcc* vcc, int mtu)
1407 struct host_cmdq* cmdq = &fore200e->host_cmdq;
1408 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
1409 struct activate_opcode activ_opcode;
1410 struct deactivate_opcode deactiv_opcode;
1411 struct vpvc vpvc;
1412 int ok;
1413 enum fore200e_aal aal = fore200e_atm2fore_aal(vcc->qos.aal);
1415 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
1417 if (activate) {
1418 FORE200E_VCC(vcc)->scheme = fore200e_select_scheme(vcc);
1420 activ_opcode.opcode = OPCODE_ACTIVATE_VCIN;
1421 activ_opcode.aal = aal;
1422 activ_opcode.scheme = FORE200E_VCC(vcc)->scheme;
1423 activ_opcode.pad = 0;
1425 else {
1426 deactiv_opcode.opcode = OPCODE_DEACTIVATE_VCIN;
1427 deactiv_opcode.pad = 0;
1430 vpvc.vci = vcc->vci;
1431 vpvc.vpi = vcc->vpi;
1433 *entry->status = STATUS_PENDING;
1435 if (activate) {
1437 #ifdef FORE200E_52BYTE_AAL0_SDU
1438 mtu = 48;
1439 #endif
1440 /* the MTU is not used by the cp, except in the case of AAL0 */
1441 fore200e->bus->write(mtu, &entry->cp_entry->cmd.activate_block.mtu);
1442 fore200e->bus->write(*(u32*)&vpvc, (u32 __iomem *)&entry->cp_entry->cmd.activate_block.vpvc);
1443 fore200e->bus->write(*(u32*)&activ_opcode, (u32 __iomem *)&entry->cp_entry->cmd.activate_block.opcode);
1445 else {
1446 fore200e->bus->write(*(u32*)&vpvc, (u32 __iomem *)&entry->cp_entry->cmd.deactivate_block.vpvc);
1447 fore200e->bus->write(*(u32*)&deactiv_opcode, (u32 __iomem *)&entry->cp_entry->cmd.deactivate_block.opcode);
1450 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
1452 *entry->status = STATUS_FREE;
1454 if (ok == 0) {
1455 printk(FORE200E "unable to %s VC %d.%d.%d\n",
1456 activate ? "open" : "close", vcc->itf, vcc->vpi, vcc->vci);
1457 return -EIO;
1460 DPRINTK(1, "VC %d.%d.%d %sed\n", vcc->itf, vcc->vpi, vcc->vci,
1461 activate ? "open" : "clos");
1463 return 0;
1467 #define FORE200E_MAX_BACK2BACK_CELLS 255 /* XXX depends on CDVT */
1469 static void
1470 fore200e_rate_ctrl(struct atm_qos* qos, struct tpd_rate* rate)
1472 if (qos->txtp.max_pcr < ATM_OC3_PCR) {
1474 /* compute the data cells to idle cells ratio from the tx PCR */
1475 rate->data_cells = qos->txtp.max_pcr * FORE200E_MAX_BACK2BACK_CELLS / ATM_OC3_PCR;
1476 rate->idle_cells = FORE200E_MAX_BACK2BACK_CELLS - rate->data_cells;
1478 else {
1479 /* disable rate control */
1480 rate->data_cells = rate->idle_cells = 0;
1485 static int
1486 fore200e_open(struct atm_vcc *vcc)
1488 struct fore200e* fore200e = FORE200E_DEV(vcc->dev);
1489 struct fore200e_vcc* fore200e_vcc;
1490 struct fore200e_vc_map* vc_map;
1491 unsigned long flags;
1492 int vci = vcc->vci;
1493 short vpi = vcc->vpi;
1495 ASSERT((vpi >= 0) && (vpi < 1<<FORE200E_VPI_BITS));
1496 ASSERT((vci >= 0) && (vci < 1<<FORE200E_VCI_BITS));
1498 spin_lock_irqsave(&fore200e->q_lock, flags);
1500 vc_map = FORE200E_VC_MAP(fore200e, vpi, vci);
1501 if (vc_map->vcc) {
1503 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1505 printk(FORE200E "VC %d.%d.%d already in use\n",
1506 fore200e->atm_dev->number, vpi, vci);
1508 return -EINVAL;
1511 vc_map->vcc = vcc;
1513 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1515 fore200e_vcc = fore200e_kmalloc(sizeof(struct fore200e_vcc), GFP_ATOMIC);
1516 if (fore200e_vcc == NULL) {
1517 vc_map->vcc = NULL;
1518 return -ENOMEM;
1521 DPRINTK(2, "opening %d.%d.%d:%d QoS = (tx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d; "
1522 "rx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d)\n",
1523 vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal),
1524 fore200e_traffic_class[ vcc->qos.txtp.traffic_class ],
1525 vcc->qos.txtp.min_pcr, vcc->qos.txtp.max_pcr, vcc->qos.txtp.max_cdv, vcc->qos.txtp.max_sdu,
1526 fore200e_traffic_class[ vcc->qos.rxtp.traffic_class ],
1527 vcc->qos.rxtp.min_pcr, vcc->qos.rxtp.max_pcr, vcc->qos.rxtp.max_cdv, vcc->qos.rxtp.max_sdu);
1529 /* pseudo-CBR bandwidth requested? */
1530 if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) {
1532 down(&fore200e->rate_sf);
1533 if (fore200e->available_cell_rate < vcc->qos.txtp.max_pcr) {
1534 up(&fore200e->rate_sf);
1536 fore200e_kfree(fore200e_vcc);
1537 vc_map->vcc = NULL;
1538 return -EAGAIN;
1541 /* reserve bandwidth */
1542 fore200e->available_cell_rate -= vcc->qos.txtp.max_pcr;
1543 up(&fore200e->rate_sf);
1546 vcc->itf = vcc->dev->number;
1548 set_bit(ATM_VF_PARTIAL,&vcc->flags);
1549 set_bit(ATM_VF_ADDR, &vcc->flags);
1551 vcc->dev_data = fore200e_vcc;
1553 if (fore200e_activate_vcin(fore200e, 1, vcc, vcc->qos.rxtp.max_sdu) < 0) {
1555 vc_map->vcc = NULL;
1557 clear_bit(ATM_VF_ADDR, &vcc->flags);
1558 clear_bit(ATM_VF_PARTIAL,&vcc->flags);
1560 vcc->dev_data = NULL;
1562 fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
1564 fore200e_kfree(fore200e_vcc);
1565 return -EINVAL;
1568 /* compute rate control parameters */
1569 if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) {
1571 fore200e_rate_ctrl(&vcc->qos, &fore200e_vcc->rate);
1572 set_bit(ATM_VF_HASQOS, &vcc->flags);
1574 DPRINTK(3, "tx on %d.%d.%d:%d, tx PCR = %d, rx PCR = %d, data_cells = %u, idle_cells = %u\n",
1575 vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal),
1576 vcc->qos.txtp.max_pcr, vcc->qos.rxtp.max_pcr,
1577 fore200e_vcc->rate.data_cells, fore200e_vcc->rate.idle_cells);
1580 fore200e_vcc->tx_min_pdu = fore200e_vcc->rx_min_pdu = MAX_PDU_SIZE + 1;
1581 fore200e_vcc->tx_max_pdu = fore200e_vcc->rx_max_pdu = 0;
1582 fore200e_vcc->tx_pdu = fore200e_vcc->rx_pdu = 0;
1584 /* new incarnation of the vcc */
1585 vc_map->incarn = ++fore200e->incarn_count;
1587 /* VC unusable before this flag is set */
1588 set_bit(ATM_VF_READY, &vcc->flags);
1590 return 0;
1594 static void
1595 fore200e_close(struct atm_vcc* vcc)
1597 struct fore200e* fore200e = FORE200E_DEV(vcc->dev);
1598 struct fore200e_vcc* fore200e_vcc;
1599 struct fore200e_vc_map* vc_map;
1600 unsigned long flags;
1602 ASSERT(vcc);
1603 ASSERT((vcc->vpi >= 0) && (vcc->vpi < 1<<FORE200E_VPI_BITS));
1604 ASSERT((vcc->vci >= 0) && (vcc->vci < 1<<FORE200E_VCI_BITS));
1606 DPRINTK(2, "closing %d.%d.%d:%d\n", vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal));
1608 clear_bit(ATM_VF_READY, &vcc->flags);
1610 fore200e_activate_vcin(fore200e, 0, vcc, 0);
1612 spin_lock_irqsave(&fore200e->q_lock, flags);
1614 vc_map = FORE200E_VC_MAP(fore200e, vcc->vpi, vcc->vci);
1616 /* the vc is no longer considered as "in use" by fore200e_open() */
1617 vc_map->vcc = NULL;
1619 vcc->itf = vcc->vci = vcc->vpi = 0;
1621 fore200e_vcc = FORE200E_VCC(vcc);
1622 vcc->dev_data = NULL;
1624 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1626 /* release reserved bandwidth, if any */
1627 if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) {
1629 down(&fore200e->rate_sf);
1630 fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
1631 up(&fore200e->rate_sf);
1633 clear_bit(ATM_VF_HASQOS, &vcc->flags);
1636 clear_bit(ATM_VF_ADDR, &vcc->flags);
1637 clear_bit(ATM_VF_PARTIAL,&vcc->flags);
1639 ASSERT(fore200e_vcc);
1640 fore200e_kfree(fore200e_vcc);
1644 static int
1645 fore200e_send(struct atm_vcc *vcc, struct sk_buff *skb)
1647 struct fore200e* fore200e = FORE200E_DEV(vcc->dev);
1648 struct fore200e_vcc* fore200e_vcc = FORE200E_VCC(vcc);
1649 struct fore200e_vc_map* vc_map;
1650 struct host_txq* txq = &fore200e->host_txq;
1651 struct host_txq_entry* entry;
1652 struct tpd* tpd;
1653 struct tpd_haddr tpd_haddr;
1654 int retry = CONFIG_ATM_FORE200E_TX_RETRY;
1655 int tx_copy = 0;
1656 int tx_len = skb->len;
1657 u32* cell_header = NULL;
1658 unsigned char* skb_data;
1659 int skb_len;
1660 unsigned char* data;
1661 unsigned long flags;
1663 ASSERT(vcc);
1664 ASSERT(atomic_read(&sk_atm(vcc)->sk_wmem_alloc) >= 0);
1665 ASSERT(fore200e);
1666 ASSERT(fore200e_vcc);
1668 if (!test_bit(ATM_VF_READY, &vcc->flags)) {
1669 DPRINTK(1, "VC %d.%d.%d not ready for tx\n", vcc->itf, vcc->vpi, vcc->vpi);
1670 dev_kfree_skb_any(skb);
1671 return -EINVAL;
1674 #ifdef FORE200E_52BYTE_AAL0_SDU
1675 if ((vcc->qos.aal == ATM_AAL0) && (vcc->qos.txtp.max_sdu == ATM_AAL0_SDU)) {
1676 cell_header = (u32*) skb->data;
1677 skb_data = skb->data + 4; /* skip 4-byte cell header */
1678 skb_len = tx_len = skb->len - 4;
1680 DPRINTK(3, "user-supplied cell header = 0x%08x\n", *cell_header);
1682 else
1683 #endif
1685 skb_data = skb->data;
1686 skb_len = skb->len;
1689 if (((unsigned long)skb_data) & 0x3) {
1691 DPRINTK(2, "misaligned tx PDU on device %s\n", fore200e->name);
1692 tx_copy = 1;
1693 tx_len = skb_len;
1696 if ((vcc->qos.aal == ATM_AAL0) && (skb_len % ATM_CELL_PAYLOAD)) {
1698 /* this simply NUKES the PCA board */
1699 DPRINTK(2, "incomplete tx AAL0 PDU on device %s\n", fore200e->name);
1700 tx_copy = 1;
1701 tx_len = ((skb_len / ATM_CELL_PAYLOAD) + 1) * ATM_CELL_PAYLOAD;
1704 if (tx_copy) {
1705 data = kmalloc(tx_len, GFP_ATOMIC | GFP_DMA);
1706 if (data == NULL) {
1707 if (vcc->pop) {
1708 vcc->pop(vcc, skb);
1710 else {
1711 dev_kfree_skb_any(skb);
1713 return -ENOMEM;
1716 memcpy(data, skb_data, skb_len);
1717 if (skb_len < tx_len)
1718 memset(data + skb_len, 0x00, tx_len - skb_len);
1720 else {
1721 data = skb_data;
1724 vc_map = FORE200E_VC_MAP(fore200e, vcc->vpi, vcc->vci);
1725 ASSERT(vc_map->vcc == vcc);
1727 retry_here:
1729 spin_lock_irqsave(&fore200e->q_lock, flags);
1731 entry = &txq->host_entry[ txq->head ];
1733 if ((*entry->status != STATUS_FREE) || (txq->txing >= QUEUE_SIZE_TX - 2)) {
1735 /* try to free completed tx queue entries */
1736 fore200e_tx_irq(fore200e);
1738 if (*entry->status != STATUS_FREE) {
1740 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1742 /* retry once again? */
1743 if (--retry > 0) {
1744 udelay(50);
1745 goto retry_here;
1748 atomic_inc(&vcc->stats->tx_err);
1750 fore200e->tx_sat++;
1751 DPRINTK(2, "tx queue of device %s is saturated, PDU dropped - heartbeat is %08x\n",
1752 fore200e->name, fore200e->cp_queues->heartbeat);
1753 if (vcc->pop) {
1754 vcc->pop(vcc, skb);
1756 else {
1757 dev_kfree_skb_any(skb);
1760 if (tx_copy)
1761 kfree(data);
1763 return -ENOBUFS;
1767 entry->incarn = vc_map->incarn;
1768 entry->vc_map = vc_map;
1769 entry->skb = skb;
1770 entry->data = tx_copy ? data : NULL;
1772 tpd = entry->tpd;
1773 tpd->tsd[ 0 ].buffer = fore200e->bus->dma_map(fore200e, data, tx_len, DMA_TO_DEVICE);
1774 tpd->tsd[ 0 ].length = tx_len;
1776 FORE200E_NEXT_ENTRY(txq->head, QUEUE_SIZE_TX);
1777 txq->txing++;
1779 /* The dma_map call above implies a dma_sync so the device can use it,
1780 * thus no explicit dma_sync call is necessary here.
1783 DPRINTK(3, "tx on %d.%d.%d:%d, len = %u (%u)\n",
1784 vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal),
1785 tpd->tsd[0].length, skb_len);
1787 if (skb_len < fore200e_vcc->tx_min_pdu)
1788 fore200e_vcc->tx_min_pdu = skb_len;
1789 if (skb_len > fore200e_vcc->tx_max_pdu)
1790 fore200e_vcc->tx_max_pdu = skb_len;
1791 fore200e_vcc->tx_pdu++;
1793 /* set tx rate control information */
1794 tpd->rate.data_cells = fore200e_vcc->rate.data_cells;
1795 tpd->rate.idle_cells = fore200e_vcc->rate.idle_cells;
1797 if (cell_header) {
1798 tpd->atm_header.clp = (*cell_header & ATM_HDR_CLP);
1799 tpd->atm_header.plt = (*cell_header & ATM_HDR_PTI_MASK) >> ATM_HDR_PTI_SHIFT;
1800 tpd->atm_header.vci = (*cell_header & ATM_HDR_VCI_MASK) >> ATM_HDR_VCI_SHIFT;
1801 tpd->atm_header.vpi = (*cell_header & ATM_HDR_VPI_MASK) >> ATM_HDR_VPI_SHIFT;
1802 tpd->atm_header.gfc = (*cell_header & ATM_HDR_GFC_MASK) >> ATM_HDR_GFC_SHIFT;
1804 else {
1805 /* set the ATM header, common to all cells conveying the PDU */
1806 tpd->atm_header.clp = 0;
1807 tpd->atm_header.plt = 0;
1808 tpd->atm_header.vci = vcc->vci;
1809 tpd->atm_header.vpi = vcc->vpi;
1810 tpd->atm_header.gfc = 0;
1813 tpd->spec.length = tx_len;
1814 tpd->spec.nseg = 1;
1815 tpd->spec.aal = fore200e_atm2fore_aal(vcc->qos.aal);
1816 tpd->spec.intr = 1;
1818 tpd_haddr.size = sizeof(struct tpd) / (1<<TPD_HADDR_SHIFT); /* size is expressed in 32 byte blocks */
1819 tpd_haddr.pad = 0;
1820 tpd_haddr.haddr = entry->tpd_dma >> TPD_HADDR_SHIFT; /* shift the address, as we are in a bitfield */
1822 *entry->status = STATUS_PENDING;
1823 fore200e->bus->write(*(u32*)&tpd_haddr, (u32 __iomem *)&entry->cp_entry->tpd_haddr);
1825 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1827 return 0;
1831 static int
1832 fore200e_getstats(struct fore200e* fore200e)
1834 struct host_cmdq* cmdq = &fore200e->host_cmdq;
1835 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
1836 struct stats_opcode opcode;
1837 int ok;
1838 u32 stats_dma_addr;
1840 if (fore200e->stats == NULL) {
1841 fore200e->stats = fore200e_kmalloc(sizeof(struct stats), GFP_KERNEL | GFP_DMA);
1842 if (fore200e->stats == NULL)
1843 return -ENOMEM;
1846 stats_dma_addr = fore200e->bus->dma_map(fore200e, fore200e->stats,
1847 sizeof(struct stats), DMA_FROM_DEVICE);
1849 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
1851 opcode.opcode = OPCODE_GET_STATS;
1852 opcode.pad = 0;
1854 fore200e->bus->write(stats_dma_addr, &entry->cp_entry->cmd.stats_block.stats_haddr);
1856 *entry->status = STATUS_PENDING;
1858 fore200e->bus->write(*(u32*)&opcode, (u32 __iomem *)&entry->cp_entry->cmd.stats_block.opcode);
1860 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
1862 *entry->status = STATUS_FREE;
1864 fore200e->bus->dma_unmap(fore200e, stats_dma_addr, sizeof(struct stats), DMA_FROM_DEVICE);
1866 if (ok == 0) {
1867 printk(FORE200E "unable to get statistics from device %s\n", fore200e->name);
1868 return -EIO;
1871 return 0;
1875 static int
1876 fore200e_getsockopt(struct atm_vcc* vcc, int level, int optname, void __user *optval, int optlen)
1878 /* struct fore200e* fore200e = FORE200E_DEV(vcc->dev); */
1880 DPRINTK(2, "getsockopt %d.%d.%d, level = %d, optname = 0x%x, optval = 0x%p, optlen = %d\n",
1881 vcc->itf, vcc->vpi, vcc->vci, level, optname, optval, optlen);
1883 return -EINVAL;
1887 static int
1888 fore200e_setsockopt(struct atm_vcc* vcc, int level, int optname, void __user *optval, int optlen)
1890 /* struct fore200e* fore200e = FORE200E_DEV(vcc->dev); */
1892 DPRINTK(2, "setsockopt %d.%d.%d, level = %d, optname = 0x%x, optval = 0x%p, optlen = %d\n",
1893 vcc->itf, vcc->vpi, vcc->vci, level, optname, optval, optlen);
1895 return -EINVAL;
1899 #if 0 /* currently unused */
1900 static int
1901 fore200e_get_oc3(struct fore200e* fore200e, struct oc3_regs* regs)
1903 struct host_cmdq* cmdq = &fore200e->host_cmdq;
1904 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
1905 struct oc3_opcode opcode;
1906 int ok;
1907 u32 oc3_regs_dma_addr;
1909 oc3_regs_dma_addr = fore200e->bus->dma_map(fore200e, regs, sizeof(struct oc3_regs), DMA_FROM_DEVICE);
1911 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
1913 opcode.opcode = OPCODE_GET_OC3;
1914 opcode.reg = 0;
1915 opcode.value = 0;
1916 opcode.mask = 0;
1918 fore200e->bus->write(oc3_regs_dma_addr, &entry->cp_entry->cmd.oc3_block.regs_haddr);
1920 *entry->status = STATUS_PENDING;
1922 fore200e->bus->write(*(u32*)&opcode, (u32*)&entry->cp_entry->cmd.oc3_block.opcode);
1924 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
1926 *entry->status = STATUS_FREE;
1928 fore200e->bus->dma_unmap(fore200e, oc3_regs_dma_addr, sizeof(struct oc3_regs), DMA_FROM_DEVICE);
1930 if (ok == 0) {
1931 printk(FORE200E "unable to get OC-3 regs of device %s\n", fore200e->name);
1932 return -EIO;
1935 return 0;
1937 #endif
1940 static int
1941 fore200e_set_oc3(struct fore200e* fore200e, u32 reg, u32 value, u32 mask)
1943 struct host_cmdq* cmdq = &fore200e->host_cmdq;
1944 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
1945 struct oc3_opcode opcode;
1946 int ok;
1948 DPRINTK(2, "set OC-3 reg = 0x%02x, value = 0x%02x, mask = 0x%02x\n", reg, value, mask);
1950 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
1952 opcode.opcode = OPCODE_SET_OC3;
1953 opcode.reg = reg;
1954 opcode.value = value;
1955 opcode.mask = mask;
1957 fore200e->bus->write(0, &entry->cp_entry->cmd.oc3_block.regs_haddr);
1959 *entry->status = STATUS_PENDING;
1961 fore200e->bus->write(*(u32*)&opcode, (u32 __iomem *)&entry->cp_entry->cmd.oc3_block.opcode);
1963 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
1965 *entry->status = STATUS_FREE;
1967 if (ok == 0) {
1968 printk(FORE200E "unable to set OC-3 reg 0x%02x of device %s\n", reg, fore200e->name);
1969 return -EIO;
1972 return 0;
1976 static int
1977 fore200e_setloop(struct fore200e* fore200e, int loop_mode)
1979 u32 mct_value, mct_mask;
1980 int error;
1982 if (!capable(CAP_NET_ADMIN))
1983 return -EPERM;
1985 switch (loop_mode) {
1987 case ATM_LM_NONE:
1988 mct_value = 0;
1989 mct_mask = SUNI_MCT_DLE | SUNI_MCT_LLE;
1990 break;
1992 case ATM_LM_LOC_PHY:
1993 mct_value = mct_mask = SUNI_MCT_DLE;
1994 break;
1996 case ATM_LM_RMT_PHY:
1997 mct_value = mct_mask = SUNI_MCT_LLE;
1998 break;
2000 default:
2001 return -EINVAL;
2004 error = fore200e_set_oc3(fore200e, SUNI_MCT, mct_value, mct_mask);
2005 if (error == 0)
2006 fore200e->loop_mode = loop_mode;
2008 return error;
2012 static inline unsigned int
2013 fore200e_swap(unsigned int in)
2015 #if defined(__LITTLE_ENDIAN)
2016 return swab32(in);
2017 #else
2018 return in;
2019 #endif
2023 static int
2024 fore200e_fetch_stats(struct fore200e* fore200e, struct sonet_stats __user *arg)
2026 struct sonet_stats tmp;
2028 if (fore200e_getstats(fore200e) < 0)
2029 return -EIO;
2031 tmp.section_bip = fore200e_swap(fore200e->stats->oc3.section_bip8_errors);
2032 tmp.line_bip = fore200e_swap(fore200e->stats->oc3.line_bip24_errors);
2033 tmp.path_bip = fore200e_swap(fore200e->stats->oc3.path_bip8_errors);
2034 tmp.line_febe = fore200e_swap(fore200e->stats->oc3.line_febe_errors);
2035 tmp.path_febe = fore200e_swap(fore200e->stats->oc3.path_febe_errors);
2036 tmp.corr_hcs = fore200e_swap(fore200e->stats->oc3.corr_hcs_errors);
2037 tmp.uncorr_hcs = fore200e_swap(fore200e->stats->oc3.ucorr_hcs_errors);
2038 tmp.tx_cells = fore200e_swap(fore200e->stats->aal0.cells_transmitted) +
2039 fore200e_swap(fore200e->stats->aal34.cells_transmitted) +
2040 fore200e_swap(fore200e->stats->aal5.cells_transmitted);
2041 tmp.rx_cells = fore200e_swap(fore200e->stats->aal0.cells_received) +
2042 fore200e_swap(fore200e->stats->aal34.cells_received) +
2043 fore200e_swap(fore200e->stats->aal5.cells_received);
2045 if (arg)
2046 return copy_to_user(arg, &tmp, sizeof(struct sonet_stats)) ? -EFAULT : 0;
2048 return 0;
2052 static int
2053 fore200e_ioctl(struct atm_dev* dev, unsigned int cmd, void __user * arg)
2055 struct fore200e* fore200e = FORE200E_DEV(dev);
2057 DPRINTK(2, "ioctl cmd = 0x%x (%u), arg = 0x%p (%lu)\n", cmd, cmd, arg, (unsigned long)arg);
2059 switch (cmd) {
2061 case SONET_GETSTAT:
2062 return fore200e_fetch_stats(fore200e, (struct sonet_stats __user *)arg);
2064 case SONET_GETDIAG:
2065 return put_user(0, (int __user *)arg) ? -EFAULT : 0;
2067 case ATM_SETLOOP:
2068 return fore200e_setloop(fore200e, (int)(unsigned long)arg);
2070 case ATM_GETLOOP:
2071 return put_user(fore200e->loop_mode, (int __user *)arg) ? -EFAULT : 0;
2073 case ATM_QUERYLOOP:
2074 return put_user(ATM_LM_LOC_PHY | ATM_LM_RMT_PHY, (int __user *)arg) ? -EFAULT : 0;
2077 return -ENOSYS; /* not implemented */
2081 static int
2082 fore200e_change_qos(struct atm_vcc* vcc,struct atm_qos* qos, int flags)
2084 struct fore200e_vcc* fore200e_vcc = FORE200E_VCC(vcc);
2085 struct fore200e* fore200e = FORE200E_DEV(vcc->dev);
2087 if (!test_bit(ATM_VF_READY, &vcc->flags)) {
2088 DPRINTK(1, "VC %d.%d.%d not ready for QoS change\n", vcc->itf, vcc->vpi, vcc->vpi);
2089 return -EINVAL;
2092 DPRINTK(2, "change_qos %d.%d.%d, "
2093 "(tx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d; "
2094 "rx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d), flags = 0x%x\n"
2095 "available_cell_rate = %u",
2096 vcc->itf, vcc->vpi, vcc->vci,
2097 fore200e_traffic_class[ qos->txtp.traffic_class ],
2098 qos->txtp.min_pcr, qos->txtp.max_pcr, qos->txtp.max_cdv, qos->txtp.max_sdu,
2099 fore200e_traffic_class[ qos->rxtp.traffic_class ],
2100 qos->rxtp.min_pcr, qos->rxtp.max_pcr, qos->rxtp.max_cdv, qos->rxtp.max_sdu,
2101 flags, fore200e->available_cell_rate);
2103 if ((qos->txtp.traffic_class == ATM_CBR) && (qos->txtp.max_pcr > 0)) {
2105 down(&fore200e->rate_sf);
2106 if (fore200e->available_cell_rate + vcc->qos.txtp.max_pcr < qos->txtp.max_pcr) {
2107 up(&fore200e->rate_sf);
2108 return -EAGAIN;
2111 fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
2112 fore200e->available_cell_rate -= qos->txtp.max_pcr;
2114 up(&fore200e->rate_sf);
2116 memcpy(&vcc->qos, qos, sizeof(struct atm_qos));
2118 /* update rate control parameters */
2119 fore200e_rate_ctrl(qos, &fore200e_vcc->rate);
2121 set_bit(ATM_VF_HASQOS, &vcc->flags);
2123 return 0;
2126 return -EINVAL;
2130 static int __init
2131 fore200e_irq_request(struct fore200e* fore200e)
2133 if (request_irq(fore200e->irq, fore200e_interrupt, SA_SHIRQ, fore200e->name, fore200e->atm_dev) < 0) {
2135 printk(FORE200E "unable to reserve IRQ %s for device %s\n",
2136 fore200e_irq_itoa(fore200e->irq), fore200e->name);
2137 return -EBUSY;
2140 printk(FORE200E "IRQ %s reserved for device %s\n",
2141 fore200e_irq_itoa(fore200e->irq), fore200e->name);
2143 #ifdef FORE200E_USE_TASKLET
2144 tasklet_init(&fore200e->tx_tasklet, fore200e_tx_tasklet, (unsigned long)fore200e);
2145 tasklet_init(&fore200e->rx_tasklet, fore200e_rx_tasklet, (unsigned long)fore200e);
2146 #endif
2148 fore200e->state = FORE200E_STATE_IRQ;
2149 return 0;
2153 static int __init
2154 fore200e_get_esi(struct fore200e* fore200e)
2156 struct prom_data* prom = fore200e_kmalloc(sizeof(struct prom_data), GFP_KERNEL | GFP_DMA);
2157 int ok, i;
2159 if (!prom)
2160 return -ENOMEM;
2162 ok = fore200e->bus->prom_read(fore200e, prom);
2163 if (ok < 0) {
2164 fore200e_kfree(prom);
2165 return -EBUSY;
2168 printk(FORE200E "device %s, rev. %c, S/N: %d, ESI: %02x:%02x:%02x:%02x:%02x:%02x\n",
2169 fore200e->name,
2170 (prom->hw_revision & 0xFF) + '@', /* probably meaningless with SBA boards */
2171 prom->serial_number & 0xFFFF,
2172 prom->mac_addr[ 2 ], prom->mac_addr[ 3 ], prom->mac_addr[ 4 ],
2173 prom->mac_addr[ 5 ], prom->mac_addr[ 6 ], prom->mac_addr[ 7 ]);
2175 for (i = 0; i < ESI_LEN; i++) {
2176 fore200e->esi[ i ] = fore200e->atm_dev->esi[ i ] = prom->mac_addr[ i + 2 ];
2179 fore200e_kfree(prom);
2181 return 0;
2185 static int __init
2186 fore200e_alloc_rx_buf(struct fore200e* fore200e)
2188 int scheme, magn, nbr, size, i;
2190 struct host_bsq* bsq;
2191 struct buffer* buffer;
2193 for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
2194 for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
2196 bsq = &fore200e->host_bsq[ scheme ][ magn ];
2198 nbr = fore200e_rx_buf_nbr[ scheme ][ magn ];
2199 size = fore200e_rx_buf_size[ scheme ][ magn ];
2201 DPRINTK(2, "rx buffers %d / %d are being allocated\n", scheme, magn);
2203 /* allocate the array of receive buffers */
2204 buffer = bsq->buffer = fore200e_kmalloc(nbr * sizeof(struct buffer), GFP_KERNEL);
2206 if (buffer == NULL)
2207 return -ENOMEM;
2209 bsq->freebuf = NULL;
2211 for (i = 0; i < nbr; i++) {
2213 buffer[ i ].scheme = scheme;
2214 buffer[ i ].magn = magn;
2215 #ifdef FORE200E_BSQ_DEBUG
2216 buffer[ i ].index = i;
2217 buffer[ i ].supplied = 0;
2218 #endif
2220 /* allocate the receive buffer body */
2221 if (fore200e_chunk_alloc(fore200e,
2222 &buffer[ i ].data, size, fore200e->bus->buffer_alignment,
2223 DMA_FROM_DEVICE) < 0) {
2225 while (i > 0)
2226 fore200e_chunk_free(fore200e, &buffer[ --i ].data);
2227 fore200e_kfree(buffer);
2229 return -ENOMEM;
2232 /* insert the buffer into the free buffer list */
2233 buffer[ i ].next = bsq->freebuf;
2234 bsq->freebuf = &buffer[ i ];
2236 /* all the buffers are free, initially */
2237 bsq->freebuf_count = nbr;
2239 #ifdef FORE200E_BSQ_DEBUG
2240 bsq_audit(3, bsq, scheme, magn);
2241 #endif
2245 fore200e->state = FORE200E_STATE_ALLOC_BUF;
2246 return 0;
2250 static int __init
2251 fore200e_init_bs_queue(struct fore200e* fore200e)
2253 int scheme, magn, i;
2255 struct host_bsq* bsq;
2256 struct cp_bsq_entry __iomem * cp_entry;
2258 for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
2259 for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
2261 DPRINTK(2, "buffer supply queue %d / %d is being initialized\n", scheme, magn);
2263 bsq = &fore200e->host_bsq[ scheme ][ magn ];
2265 /* allocate and align the array of status words */
2266 if (fore200e->bus->dma_chunk_alloc(fore200e,
2267 &bsq->status,
2268 sizeof(enum status),
2269 QUEUE_SIZE_BS,
2270 fore200e->bus->status_alignment) < 0) {
2271 return -ENOMEM;
2274 /* allocate and align the array of receive buffer descriptors */
2275 if (fore200e->bus->dma_chunk_alloc(fore200e,
2276 &bsq->rbd_block,
2277 sizeof(struct rbd_block),
2278 QUEUE_SIZE_BS,
2279 fore200e->bus->descr_alignment) < 0) {
2281 fore200e->bus->dma_chunk_free(fore200e, &bsq->status);
2282 return -ENOMEM;
2285 /* get the base address of the cp resident buffer supply queue entries */
2286 cp_entry = fore200e->virt_base +
2287 fore200e->bus->read(&fore200e->cp_queues->cp_bsq[ scheme ][ magn ]);
2289 /* fill the host resident and cp resident buffer supply queue entries */
2290 for (i = 0; i < QUEUE_SIZE_BS; i++) {
2292 bsq->host_entry[ i ].status =
2293 FORE200E_INDEX(bsq->status.align_addr, enum status, i);
2294 bsq->host_entry[ i ].rbd_block =
2295 FORE200E_INDEX(bsq->rbd_block.align_addr, struct rbd_block, i);
2296 bsq->host_entry[ i ].rbd_block_dma =
2297 FORE200E_DMA_INDEX(bsq->rbd_block.dma_addr, struct rbd_block, i);
2298 bsq->host_entry[ i ].cp_entry = &cp_entry[ i ];
2300 *bsq->host_entry[ i ].status = STATUS_FREE;
2302 fore200e->bus->write(FORE200E_DMA_INDEX(bsq->status.dma_addr, enum status, i),
2303 &cp_entry[ i ].status_haddr);
2308 fore200e->state = FORE200E_STATE_INIT_BSQ;
2309 return 0;
2313 static int __init
2314 fore200e_init_rx_queue(struct fore200e* fore200e)
2316 struct host_rxq* rxq = &fore200e->host_rxq;
2317 struct cp_rxq_entry __iomem * cp_entry;
2318 int i;
2320 DPRINTK(2, "receive queue is being initialized\n");
2322 /* allocate and align the array of status words */
2323 if (fore200e->bus->dma_chunk_alloc(fore200e,
2324 &rxq->status,
2325 sizeof(enum status),
2326 QUEUE_SIZE_RX,
2327 fore200e->bus->status_alignment) < 0) {
2328 return -ENOMEM;
2331 /* allocate and align the array of receive PDU descriptors */
2332 if (fore200e->bus->dma_chunk_alloc(fore200e,
2333 &rxq->rpd,
2334 sizeof(struct rpd),
2335 QUEUE_SIZE_RX,
2336 fore200e->bus->descr_alignment) < 0) {
2338 fore200e->bus->dma_chunk_free(fore200e, &rxq->status);
2339 return -ENOMEM;
2342 /* get the base address of the cp resident rx queue entries */
2343 cp_entry = fore200e->virt_base + fore200e->bus->read(&fore200e->cp_queues->cp_rxq);
2345 /* fill the host resident and cp resident rx entries */
2346 for (i=0; i < QUEUE_SIZE_RX; i++) {
2348 rxq->host_entry[ i ].status =
2349 FORE200E_INDEX(rxq->status.align_addr, enum status, i);
2350 rxq->host_entry[ i ].rpd =
2351 FORE200E_INDEX(rxq->rpd.align_addr, struct rpd, i);
2352 rxq->host_entry[ i ].rpd_dma =
2353 FORE200E_DMA_INDEX(rxq->rpd.dma_addr, struct rpd, i);
2354 rxq->host_entry[ i ].cp_entry = &cp_entry[ i ];
2356 *rxq->host_entry[ i ].status = STATUS_FREE;
2358 fore200e->bus->write(FORE200E_DMA_INDEX(rxq->status.dma_addr, enum status, i),
2359 &cp_entry[ i ].status_haddr);
2361 fore200e->bus->write(FORE200E_DMA_INDEX(rxq->rpd.dma_addr, struct rpd, i),
2362 &cp_entry[ i ].rpd_haddr);
2365 /* set the head entry of the queue */
2366 rxq->head = 0;
2368 fore200e->state = FORE200E_STATE_INIT_RXQ;
2369 return 0;
2373 static int __init
2374 fore200e_init_tx_queue(struct fore200e* fore200e)
2376 struct host_txq* txq = &fore200e->host_txq;
2377 struct cp_txq_entry __iomem * cp_entry;
2378 int i;
2380 DPRINTK(2, "transmit queue is being initialized\n");
2382 /* allocate and align the array of status words */
2383 if (fore200e->bus->dma_chunk_alloc(fore200e,
2384 &txq->status,
2385 sizeof(enum status),
2386 QUEUE_SIZE_TX,
2387 fore200e->bus->status_alignment) < 0) {
2388 return -ENOMEM;
2391 /* allocate and align the array of transmit PDU descriptors */
2392 if (fore200e->bus->dma_chunk_alloc(fore200e,
2393 &txq->tpd,
2394 sizeof(struct tpd),
2395 QUEUE_SIZE_TX,
2396 fore200e->bus->descr_alignment) < 0) {
2398 fore200e->bus->dma_chunk_free(fore200e, &txq->status);
2399 return -ENOMEM;
2402 /* get the base address of the cp resident tx queue entries */
2403 cp_entry = fore200e->virt_base + fore200e->bus->read(&fore200e->cp_queues->cp_txq);
2405 /* fill the host resident and cp resident tx entries */
2406 for (i=0; i < QUEUE_SIZE_TX; i++) {
2408 txq->host_entry[ i ].status =
2409 FORE200E_INDEX(txq->status.align_addr, enum status, i);
2410 txq->host_entry[ i ].tpd =
2411 FORE200E_INDEX(txq->tpd.align_addr, struct tpd, i);
2412 txq->host_entry[ i ].tpd_dma =
2413 FORE200E_DMA_INDEX(txq->tpd.dma_addr, struct tpd, i);
2414 txq->host_entry[ i ].cp_entry = &cp_entry[ i ];
2416 *txq->host_entry[ i ].status = STATUS_FREE;
2418 fore200e->bus->write(FORE200E_DMA_INDEX(txq->status.dma_addr, enum status, i),
2419 &cp_entry[ i ].status_haddr);
2421 /* although there is a one-to-one mapping of tx queue entries and tpds,
2422 we do not write here the DMA (physical) base address of each tpd into
2423 the related cp resident entry, because the cp relies on this write
2424 operation to detect that a new pdu has been submitted for tx */
2427 /* set the head and tail entries of the queue */
2428 txq->head = 0;
2429 txq->tail = 0;
2431 fore200e->state = FORE200E_STATE_INIT_TXQ;
2432 return 0;
2436 static int __init
2437 fore200e_init_cmd_queue(struct fore200e* fore200e)
2439 struct host_cmdq* cmdq = &fore200e->host_cmdq;
2440 struct cp_cmdq_entry __iomem * cp_entry;
2441 int i;
2443 DPRINTK(2, "command queue is being initialized\n");
2445 /* allocate and align the array of status words */
2446 if (fore200e->bus->dma_chunk_alloc(fore200e,
2447 &cmdq->status,
2448 sizeof(enum status),
2449 QUEUE_SIZE_CMD,
2450 fore200e->bus->status_alignment) < 0) {
2451 return -ENOMEM;
2454 /* get the base address of the cp resident cmd queue entries */
2455 cp_entry = fore200e->virt_base + fore200e->bus->read(&fore200e->cp_queues->cp_cmdq);
2457 /* fill the host resident and cp resident cmd entries */
2458 for (i=0; i < QUEUE_SIZE_CMD; i++) {
2460 cmdq->host_entry[ i ].status =
2461 FORE200E_INDEX(cmdq->status.align_addr, enum status, i);
2462 cmdq->host_entry[ i ].cp_entry = &cp_entry[ i ];
2464 *cmdq->host_entry[ i ].status = STATUS_FREE;
2466 fore200e->bus->write(FORE200E_DMA_INDEX(cmdq->status.dma_addr, enum status, i),
2467 &cp_entry[ i ].status_haddr);
2470 /* set the head entry of the queue */
2471 cmdq->head = 0;
2473 fore200e->state = FORE200E_STATE_INIT_CMDQ;
2474 return 0;
2478 static void __init
2479 fore200e_param_bs_queue(struct fore200e* fore200e,
2480 enum buffer_scheme scheme, enum buffer_magn magn,
2481 int queue_length, int pool_size, int supply_blksize)
2483 struct bs_spec __iomem * bs_spec = &fore200e->cp_queues->init.bs_spec[ scheme ][ magn ];
2485 fore200e->bus->write(queue_length, &bs_spec->queue_length);
2486 fore200e->bus->write(fore200e_rx_buf_size[ scheme ][ magn ], &bs_spec->buffer_size);
2487 fore200e->bus->write(pool_size, &bs_spec->pool_size);
2488 fore200e->bus->write(supply_blksize, &bs_spec->supply_blksize);
2492 static int __init
2493 fore200e_initialize(struct fore200e* fore200e)
2495 struct cp_queues __iomem * cpq;
2496 int ok, scheme, magn;
2498 DPRINTK(2, "device %s being initialized\n", fore200e->name);
2500 init_MUTEX(&fore200e->rate_sf);
2501 spin_lock_init(&fore200e->q_lock);
2503 cpq = fore200e->cp_queues = fore200e->virt_base + FORE200E_CP_QUEUES_OFFSET;
2505 /* enable cp to host interrupts */
2506 fore200e->bus->write(1, &cpq->imask);
2508 if (fore200e->bus->irq_enable)
2509 fore200e->bus->irq_enable(fore200e);
2511 fore200e->bus->write(NBR_CONNECT, &cpq->init.num_connect);
2513 fore200e->bus->write(QUEUE_SIZE_CMD, &cpq->init.cmd_queue_len);
2514 fore200e->bus->write(QUEUE_SIZE_RX, &cpq->init.rx_queue_len);
2515 fore200e->bus->write(QUEUE_SIZE_TX, &cpq->init.tx_queue_len);
2517 fore200e->bus->write(RSD_EXTENSION, &cpq->init.rsd_extension);
2518 fore200e->bus->write(TSD_EXTENSION, &cpq->init.tsd_extension);
2520 for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++)
2521 for (magn = 0; magn < BUFFER_MAGN_NBR; magn++)
2522 fore200e_param_bs_queue(fore200e, scheme, magn,
2523 QUEUE_SIZE_BS,
2524 fore200e_rx_buf_nbr[ scheme ][ magn ],
2525 RBD_BLK_SIZE);
2527 /* issue the initialize command */
2528 fore200e->bus->write(STATUS_PENDING, &cpq->init.status);
2529 fore200e->bus->write(OPCODE_INITIALIZE, &cpq->init.opcode);
2531 ok = fore200e_io_poll(fore200e, &cpq->init.status, STATUS_COMPLETE, 3000);
2532 if (ok == 0) {
2533 printk(FORE200E "device %s initialization failed\n", fore200e->name);
2534 return -ENODEV;
2537 printk(FORE200E "device %s initialized\n", fore200e->name);
2539 fore200e->state = FORE200E_STATE_INITIALIZE;
2540 return 0;
2544 static void __init
2545 fore200e_monitor_putc(struct fore200e* fore200e, char c)
2547 struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
2549 #if 0
2550 printk("%c", c);
2551 #endif
2552 fore200e->bus->write(((u32) c) | FORE200E_CP_MONITOR_UART_AVAIL, &monitor->soft_uart.send);
2556 static int __init
2557 fore200e_monitor_getc(struct fore200e* fore200e)
2559 struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
2560 unsigned long timeout = jiffies + msecs_to_jiffies(50);
2561 int c;
2563 while (time_before(jiffies, timeout)) {
2565 c = (int) fore200e->bus->read(&monitor->soft_uart.recv);
2567 if (c & FORE200E_CP_MONITOR_UART_AVAIL) {
2569 fore200e->bus->write(FORE200E_CP_MONITOR_UART_FREE, &monitor->soft_uart.recv);
2570 #if 0
2571 printk("%c", c & 0xFF);
2572 #endif
2573 return c & 0xFF;
2577 return -1;
2581 static void __init
2582 fore200e_monitor_puts(struct fore200e* fore200e, char* str)
2584 while (*str) {
2586 /* the i960 monitor doesn't accept any new character if it has something to say */
2587 while (fore200e_monitor_getc(fore200e) >= 0);
2589 fore200e_monitor_putc(fore200e, *str++);
2592 while (fore200e_monitor_getc(fore200e) >= 0);
2596 static int __init
2597 fore200e_start_fw(struct fore200e* fore200e)
2599 int ok;
2600 char cmd[ 48 ];
2601 struct fw_header* fw_header = (struct fw_header*) fore200e->bus->fw_data;
2603 DPRINTK(2, "device %s firmware being started\n", fore200e->name);
2605 #if defined(__sparc_v9__)
2606 /* reported to be required by SBA cards on some sparc64 hosts */
2607 fore200e_spin(100);
2608 #endif
2610 sprintf(cmd, "\rgo %x\r", le32_to_cpu(fw_header->start_offset));
2612 fore200e_monitor_puts(fore200e, cmd);
2614 ok = fore200e_io_poll(fore200e, &fore200e->cp_monitor->bstat, BSTAT_CP_RUNNING, 1000);
2615 if (ok == 0) {
2616 printk(FORE200E "device %s firmware didn't start\n", fore200e->name);
2617 return -ENODEV;
2620 printk(FORE200E "device %s firmware started\n", fore200e->name);
2622 fore200e->state = FORE200E_STATE_START_FW;
2623 return 0;
2627 static int __init
2628 fore200e_load_fw(struct fore200e* fore200e)
2630 u32* fw_data = (u32*) fore200e->bus->fw_data;
2631 u32 fw_size = (u32) *fore200e->bus->fw_size / sizeof(u32);
2633 struct fw_header* fw_header = (struct fw_header*) fw_data;
2635 u32 __iomem *load_addr = fore200e->virt_base + le32_to_cpu(fw_header->load_offset);
2637 DPRINTK(2, "device %s firmware being loaded at 0x%p (%d words)\n",
2638 fore200e->name, load_addr, fw_size);
2640 if (le32_to_cpu(fw_header->magic) != FW_HEADER_MAGIC) {
2641 printk(FORE200E "corrupted %s firmware image\n", fore200e->bus->model_name);
2642 return -ENODEV;
2645 for (; fw_size--; fw_data++, load_addr++)
2646 fore200e->bus->write(le32_to_cpu(*fw_data), load_addr);
2648 fore200e->state = FORE200E_STATE_LOAD_FW;
2649 return 0;
2653 static int __init
2654 fore200e_register(struct fore200e* fore200e)
2656 struct atm_dev* atm_dev;
2658 DPRINTK(2, "device %s being registered\n", fore200e->name);
2660 atm_dev = atm_dev_register(fore200e->bus->proc_name, &fore200e_ops, -1,
2661 NULL);
2662 if (atm_dev == NULL) {
2663 printk(FORE200E "unable to register device %s\n", fore200e->name);
2664 return -ENODEV;
2667 atm_dev->dev_data = fore200e;
2668 fore200e->atm_dev = atm_dev;
2670 atm_dev->ci_range.vpi_bits = FORE200E_VPI_BITS;
2671 atm_dev->ci_range.vci_bits = FORE200E_VCI_BITS;
2673 fore200e->available_cell_rate = ATM_OC3_PCR;
2675 fore200e->state = FORE200E_STATE_REGISTER;
2676 return 0;
2680 static int __init
2681 fore200e_init(struct fore200e* fore200e)
2683 if (fore200e_register(fore200e) < 0)
2684 return -ENODEV;
2686 if (fore200e->bus->configure(fore200e) < 0)
2687 return -ENODEV;
2689 if (fore200e->bus->map(fore200e) < 0)
2690 return -ENODEV;
2692 if (fore200e_reset(fore200e, 1) < 0)
2693 return -ENODEV;
2695 if (fore200e_load_fw(fore200e) < 0)
2696 return -ENODEV;
2698 if (fore200e_start_fw(fore200e) < 0)
2699 return -ENODEV;
2701 if (fore200e_initialize(fore200e) < 0)
2702 return -ENODEV;
2704 if (fore200e_init_cmd_queue(fore200e) < 0)
2705 return -ENOMEM;
2707 if (fore200e_init_tx_queue(fore200e) < 0)
2708 return -ENOMEM;
2710 if (fore200e_init_rx_queue(fore200e) < 0)
2711 return -ENOMEM;
2713 if (fore200e_init_bs_queue(fore200e) < 0)
2714 return -ENOMEM;
2716 if (fore200e_alloc_rx_buf(fore200e) < 0)
2717 return -ENOMEM;
2719 if (fore200e_get_esi(fore200e) < 0)
2720 return -EIO;
2722 if (fore200e_irq_request(fore200e) < 0)
2723 return -EBUSY;
2725 fore200e_supply(fore200e);
2727 /* all done, board initialization is now complete */
2728 fore200e->state = FORE200E_STATE_COMPLETE;
2729 return 0;
2733 static int __devinit
2734 fore200e_pca_detect(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
2736 const struct fore200e_bus* bus = (struct fore200e_bus*) pci_ent->driver_data;
2737 struct fore200e* fore200e;
2738 int err = 0;
2739 static int index = 0;
2741 if (pci_enable_device(pci_dev)) {
2742 err = -EINVAL;
2743 goto out;
2746 fore200e = fore200e_kmalloc(sizeof(struct fore200e), GFP_KERNEL);
2747 if (fore200e == NULL) {
2748 err = -ENOMEM;
2749 goto out_disable;
2752 fore200e->bus = bus;
2753 fore200e->bus_dev = pci_dev;
2754 fore200e->irq = pci_dev->irq;
2755 fore200e->phys_base = pci_resource_start(pci_dev, 0);
2757 sprintf(fore200e->name, "%s-%d", bus->model_name, index - 1);
2759 pci_set_master(pci_dev);
2761 printk(FORE200E "device %s found at 0x%lx, IRQ %s\n",
2762 fore200e->bus->model_name,
2763 fore200e->phys_base, fore200e_irq_itoa(fore200e->irq));
2765 sprintf(fore200e->name, "%s-%d", bus->model_name, index);
2767 err = fore200e_init(fore200e);
2768 if (err < 0) {
2769 fore200e_shutdown(fore200e);
2770 goto out_free;
2773 ++index;
2774 pci_set_drvdata(pci_dev, fore200e);
2776 out:
2777 return err;
2779 out_free:
2780 kfree(fore200e);
2781 out_disable:
2782 pci_disable_device(pci_dev);
2783 goto out;
2787 static void __devexit fore200e_pca_remove_one(struct pci_dev *pci_dev)
2789 struct fore200e *fore200e;
2791 fore200e = pci_get_drvdata(pci_dev);
2793 fore200e_shutdown(fore200e);
2794 kfree(fore200e);
2795 pci_disable_device(pci_dev);
2799 #ifdef CONFIG_ATM_FORE200E_PCA
2800 static struct pci_device_id fore200e_pca_tbl[] = {
2801 { PCI_VENDOR_ID_FORE, PCI_DEVICE_ID_FORE_PCA200E, PCI_ANY_ID, PCI_ANY_ID,
2802 0, 0, (unsigned long) &fore200e_bus[0] },
2803 { 0, }
2806 MODULE_DEVICE_TABLE(pci, fore200e_pca_tbl);
2808 static struct pci_driver fore200e_pca_driver = {
2809 .name = "fore_200e",
2810 .probe = fore200e_pca_detect,
2811 .remove = __devexit_p(fore200e_pca_remove_one),
2812 .id_table = fore200e_pca_tbl,
2814 #endif
2817 static int __init
2818 fore200e_module_init(void)
2820 const struct fore200e_bus* bus;
2821 struct fore200e* fore200e;
2822 int index;
2824 printk(FORE200E "FORE Systems 200E-series ATM driver - version " FORE200E_VERSION "\n");
2826 /* for each configured bus interface */
2827 for (bus = fore200e_bus; bus->model_name; bus++) {
2829 /* detect all boards present on that bus */
2830 for (index = 0; bus->detect && (fore200e = bus->detect(bus, index)); index++) {
2832 printk(FORE200E "device %s found at 0x%lx, IRQ %s\n",
2833 fore200e->bus->model_name,
2834 fore200e->phys_base, fore200e_irq_itoa(fore200e->irq));
2836 sprintf(fore200e->name, "%s-%d", bus->model_name, index);
2838 if (fore200e_init(fore200e) < 0) {
2840 fore200e_shutdown(fore200e);
2841 break;
2844 list_add(&fore200e->entry, &fore200e_boards);
2848 #ifdef CONFIG_ATM_FORE200E_PCA
2849 if (!pci_register_driver(&fore200e_pca_driver))
2850 return 0;
2851 #endif
2853 if (!list_empty(&fore200e_boards))
2854 return 0;
2856 return -ENODEV;
2860 static void __exit
2861 fore200e_module_cleanup(void)
2863 struct fore200e *fore200e, *next;
2865 #ifdef CONFIG_ATM_FORE200E_PCA
2866 pci_unregister_driver(&fore200e_pca_driver);
2867 #endif
2869 list_for_each_entry_safe(fore200e, next, &fore200e_boards, entry) {
2870 fore200e_shutdown(fore200e);
2871 kfree(fore200e);
2873 DPRINTK(1, "module being removed\n");
2877 static int
2878 fore200e_proc_read(struct atm_dev *dev, loff_t* pos, char* page)
2880 struct fore200e* fore200e = FORE200E_DEV(dev);
2881 struct fore200e_vcc* fore200e_vcc;
2882 struct atm_vcc* vcc;
2883 int i, len, left = *pos;
2884 unsigned long flags;
2886 if (!left--) {
2888 if (fore200e_getstats(fore200e) < 0)
2889 return -EIO;
2891 len = sprintf(page,"\n"
2892 " device:\n"
2893 " internal name:\t\t%s\n", fore200e->name);
2895 /* print bus-specific information */
2896 if (fore200e->bus->proc_read)
2897 len += fore200e->bus->proc_read(fore200e, page + len);
2899 len += sprintf(page + len,
2900 " interrupt line:\t\t%s\n"
2901 " physical base address:\t0x%p\n"
2902 " virtual base address:\t0x%p\n"
2903 " factory address (ESI):\t%02x:%02x:%02x:%02x:%02x:%02x\n"
2904 " board serial number:\t\t%d\n\n",
2905 fore200e_irq_itoa(fore200e->irq),
2906 (void*)fore200e->phys_base,
2907 fore200e->virt_base,
2908 fore200e->esi[0], fore200e->esi[1], fore200e->esi[2],
2909 fore200e->esi[3], fore200e->esi[4], fore200e->esi[5],
2910 fore200e->esi[4] * 256 + fore200e->esi[5]);
2912 return len;
2915 if (!left--)
2916 return sprintf(page,
2917 " free small bufs, scheme 1:\t%d\n"
2918 " free large bufs, scheme 1:\t%d\n"
2919 " free small bufs, scheme 2:\t%d\n"
2920 " free large bufs, scheme 2:\t%d\n",
2921 fore200e->host_bsq[ BUFFER_SCHEME_ONE ][ BUFFER_MAGN_SMALL ].freebuf_count,
2922 fore200e->host_bsq[ BUFFER_SCHEME_ONE ][ BUFFER_MAGN_LARGE ].freebuf_count,
2923 fore200e->host_bsq[ BUFFER_SCHEME_TWO ][ BUFFER_MAGN_SMALL ].freebuf_count,
2924 fore200e->host_bsq[ BUFFER_SCHEME_TWO ][ BUFFER_MAGN_LARGE ].freebuf_count);
2926 if (!left--) {
2927 u32 hb = fore200e->bus->read(&fore200e->cp_queues->heartbeat);
2929 len = sprintf(page,"\n\n"
2930 " cell processor:\n"
2931 " heartbeat state:\t\t");
2933 if (hb >> 16 != 0xDEAD)
2934 len += sprintf(page + len, "0x%08x\n", hb);
2935 else
2936 len += sprintf(page + len, "*** FATAL ERROR %04x ***\n", hb & 0xFFFF);
2938 return len;
2941 if (!left--) {
2942 static const char* media_name[] = {
2943 "unshielded twisted pair",
2944 "multimode optical fiber ST",
2945 "multimode optical fiber SC",
2946 "single-mode optical fiber ST",
2947 "single-mode optical fiber SC",
2948 "unknown"
2951 static const char* oc3_mode[] = {
2952 "normal operation",
2953 "diagnostic loopback",
2954 "line loopback",
2955 "unknown"
2958 u32 fw_release = fore200e->bus->read(&fore200e->cp_queues->fw_release);
2959 u32 mon960_release = fore200e->bus->read(&fore200e->cp_queues->mon960_release);
2960 u32 oc3_revision = fore200e->bus->read(&fore200e->cp_queues->oc3_revision);
2961 u32 media_index = FORE200E_MEDIA_INDEX(fore200e->bus->read(&fore200e->cp_queues->media_type));
2962 u32 oc3_index;
2964 if ((media_index < 0) || (media_index > 4))
2965 media_index = 5;
2967 switch (fore200e->loop_mode) {
2968 case ATM_LM_NONE: oc3_index = 0;
2969 break;
2970 case ATM_LM_LOC_PHY: oc3_index = 1;
2971 break;
2972 case ATM_LM_RMT_PHY: oc3_index = 2;
2973 break;
2974 default: oc3_index = 3;
2977 return sprintf(page,
2978 " firmware release:\t\t%d.%d.%d\n"
2979 " monitor release:\t\t%d.%d\n"
2980 " media type:\t\t\t%s\n"
2981 " OC-3 revision:\t\t0x%x\n"
2982 " OC-3 mode:\t\t\t%s",
2983 fw_release >> 16, fw_release << 16 >> 24, fw_release << 24 >> 24,
2984 mon960_release >> 16, mon960_release << 16 >> 16,
2985 media_name[ media_index ],
2986 oc3_revision,
2987 oc3_mode[ oc3_index ]);
2990 if (!left--) {
2991 struct cp_monitor __iomem * cp_monitor = fore200e->cp_monitor;
2993 return sprintf(page,
2994 "\n\n"
2995 " monitor:\n"
2996 " version number:\t\t%d\n"
2997 " boot status word:\t\t0x%08x\n",
2998 fore200e->bus->read(&cp_monitor->mon_version),
2999 fore200e->bus->read(&cp_monitor->bstat));
3002 if (!left--)
3003 return sprintf(page,
3004 "\n"
3005 " device statistics:\n"
3006 " 4b5b:\n"
3007 " crc_header_errors:\t\t%10u\n"
3008 " framing_errors:\t\t%10u\n",
3009 fore200e_swap(fore200e->stats->phy.crc_header_errors),
3010 fore200e_swap(fore200e->stats->phy.framing_errors));
3012 if (!left--)
3013 return sprintf(page, "\n"
3014 " OC-3:\n"
3015 " section_bip8_errors:\t%10u\n"
3016 " path_bip8_errors:\t\t%10u\n"
3017 " line_bip24_errors:\t\t%10u\n"
3018 " line_febe_errors:\t\t%10u\n"
3019 " path_febe_errors:\t\t%10u\n"
3020 " corr_hcs_errors:\t\t%10u\n"
3021 " ucorr_hcs_errors:\t\t%10u\n",
3022 fore200e_swap(fore200e->stats->oc3.section_bip8_errors),
3023 fore200e_swap(fore200e->stats->oc3.path_bip8_errors),
3024 fore200e_swap(fore200e->stats->oc3.line_bip24_errors),
3025 fore200e_swap(fore200e->stats->oc3.line_febe_errors),
3026 fore200e_swap(fore200e->stats->oc3.path_febe_errors),
3027 fore200e_swap(fore200e->stats->oc3.corr_hcs_errors),
3028 fore200e_swap(fore200e->stats->oc3.ucorr_hcs_errors));
3030 if (!left--)
3031 return sprintf(page,"\n"
3032 " ATM:\t\t\t\t cells\n"
3033 " TX:\t\t\t%10u\n"
3034 " RX:\t\t\t%10u\n"
3035 " vpi out of range:\t\t%10u\n"
3036 " vpi no conn:\t\t%10u\n"
3037 " vci out of range:\t\t%10u\n"
3038 " vci no conn:\t\t%10u\n",
3039 fore200e_swap(fore200e->stats->atm.cells_transmitted),
3040 fore200e_swap(fore200e->stats->atm.cells_received),
3041 fore200e_swap(fore200e->stats->atm.vpi_bad_range),
3042 fore200e_swap(fore200e->stats->atm.vpi_no_conn),
3043 fore200e_swap(fore200e->stats->atm.vci_bad_range),
3044 fore200e_swap(fore200e->stats->atm.vci_no_conn));
3046 if (!left--)
3047 return sprintf(page,"\n"
3048 " AAL0:\t\t\t cells\n"
3049 " TX:\t\t\t%10u\n"
3050 " RX:\t\t\t%10u\n"
3051 " dropped:\t\t\t%10u\n",
3052 fore200e_swap(fore200e->stats->aal0.cells_transmitted),
3053 fore200e_swap(fore200e->stats->aal0.cells_received),
3054 fore200e_swap(fore200e->stats->aal0.cells_dropped));
3056 if (!left--)
3057 return sprintf(page,"\n"
3058 " AAL3/4:\n"
3059 " SAR sublayer:\t\t cells\n"
3060 " TX:\t\t\t%10u\n"
3061 " RX:\t\t\t%10u\n"
3062 " dropped:\t\t\t%10u\n"
3063 " CRC errors:\t\t%10u\n"
3064 " protocol errors:\t\t%10u\n\n"
3065 " CS sublayer:\t\t PDUs\n"
3066 " TX:\t\t\t%10u\n"
3067 " RX:\t\t\t%10u\n"
3068 " dropped:\t\t\t%10u\n"
3069 " protocol errors:\t\t%10u\n",
3070 fore200e_swap(fore200e->stats->aal34.cells_transmitted),
3071 fore200e_swap(fore200e->stats->aal34.cells_received),
3072 fore200e_swap(fore200e->stats->aal34.cells_dropped),
3073 fore200e_swap(fore200e->stats->aal34.cells_crc_errors),
3074 fore200e_swap(fore200e->stats->aal34.cells_protocol_errors),
3075 fore200e_swap(fore200e->stats->aal34.cspdus_transmitted),
3076 fore200e_swap(fore200e->stats->aal34.cspdus_received),
3077 fore200e_swap(fore200e->stats->aal34.cspdus_dropped),
3078 fore200e_swap(fore200e->stats->aal34.cspdus_protocol_errors));
3080 if (!left--)
3081 return sprintf(page,"\n"
3082 " AAL5:\n"
3083 " SAR sublayer:\t\t cells\n"
3084 " TX:\t\t\t%10u\n"
3085 " RX:\t\t\t%10u\n"
3086 " dropped:\t\t\t%10u\n"
3087 " congestions:\t\t%10u\n\n"
3088 " CS sublayer:\t\t PDUs\n"
3089 " TX:\t\t\t%10u\n"
3090 " RX:\t\t\t%10u\n"
3091 " dropped:\t\t\t%10u\n"
3092 " CRC errors:\t\t%10u\n"
3093 " protocol errors:\t\t%10u\n",
3094 fore200e_swap(fore200e->stats->aal5.cells_transmitted),
3095 fore200e_swap(fore200e->stats->aal5.cells_received),
3096 fore200e_swap(fore200e->stats->aal5.cells_dropped),
3097 fore200e_swap(fore200e->stats->aal5.congestion_experienced),
3098 fore200e_swap(fore200e->stats->aal5.cspdus_transmitted),
3099 fore200e_swap(fore200e->stats->aal5.cspdus_received),
3100 fore200e_swap(fore200e->stats->aal5.cspdus_dropped),
3101 fore200e_swap(fore200e->stats->aal5.cspdus_crc_errors),
3102 fore200e_swap(fore200e->stats->aal5.cspdus_protocol_errors));
3104 if (!left--)
3105 return sprintf(page,"\n"
3106 " AUX:\t\t allocation failures\n"
3107 " small b1:\t\t\t%10u\n"
3108 " large b1:\t\t\t%10u\n"
3109 " small b2:\t\t\t%10u\n"
3110 " large b2:\t\t\t%10u\n"
3111 " RX PDUs:\t\t\t%10u\n"
3112 " TX PDUs:\t\t\t%10lu\n",
3113 fore200e_swap(fore200e->stats->aux.small_b1_failed),
3114 fore200e_swap(fore200e->stats->aux.large_b1_failed),
3115 fore200e_swap(fore200e->stats->aux.small_b2_failed),
3116 fore200e_swap(fore200e->stats->aux.large_b2_failed),
3117 fore200e_swap(fore200e->stats->aux.rpd_alloc_failed),
3118 fore200e->tx_sat);
3120 if (!left--)
3121 return sprintf(page,"\n"
3122 " receive carrier:\t\t\t%s\n",
3123 fore200e->stats->aux.receive_carrier ? "ON" : "OFF!");
3125 if (!left--) {
3126 return sprintf(page,"\n"
3127 " VCCs:\n address VPI VCI AAL "
3128 "TX PDUs TX min/max size RX PDUs RX min/max size\n");
3131 for (i = 0; i < NBR_CONNECT; i++) {
3133 vcc = fore200e->vc_map[i].vcc;
3135 if (vcc == NULL)
3136 continue;
3138 spin_lock_irqsave(&fore200e->q_lock, flags);
3140 if (vcc && test_bit(ATM_VF_READY, &vcc->flags) && !left--) {
3142 fore200e_vcc = FORE200E_VCC(vcc);
3143 ASSERT(fore200e_vcc);
3145 len = sprintf(page,
3146 " %08x %03d %05d %1d %09lu %05d/%05d %09lu %05d/%05d\n",
3147 (u32)(unsigned long)vcc,
3148 vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal),
3149 fore200e_vcc->tx_pdu,
3150 fore200e_vcc->tx_min_pdu > 0xFFFF ? 0 : fore200e_vcc->tx_min_pdu,
3151 fore200e_vcc->tx_max_pdu,
3152 fore200e_vcc->rx_pdu,
3153 fore200e_vcc->rx_min_pdu > 0xFFFF ? 0 : fore200e_vcc->rx_min_pdu,
3154 fore200e_vcc->rx_max_pdu);
3156 spin_unlock_irqrestore(&fore200e->q_lock, flags);
3157 return len;
3160 spin_unlock_irqrestore(&fore200e->q_lock, flags);
3163 return 0;
3166 module_init(fore200e_module_init);
3167 module_exit(fore200e_module_cleanup);
3170 static const struct atmdev_ops fore200e_ops =
3172 .open = fore200e_open,
3173 .close = fore200e_close,
3174 .ioctl = fore200e_ioctl,
3175 .getsockopt = fore200e_getsockopt,
3176 .setsockopt = fore200e_setsockopt,
3177 .send = fore200e_send,
3178 .change_qos = fore200e_change_qos,
3179 .proc_read = fore200e_proc_read,
3180 .owner = THIS_MODULE
3184 #ifdef CONFIG_ATM_FORE200E_PCA
3185 extern const unsigned char _fore200e_pca_fw_data[];
3186 extern const unsigned int _fore200e_pca_fw_size;
3187 #endif
3188 #ifdef CONFIG_ATM_FORE200E_SBA
3189 extern const unsigned char _fore200e_sba_fw_data[];
3190 extern const unsigned int _fore200e_sba_fw_size;
3191 #endif
3193 static const struct fore200e_bus fore200e_bus[] = {
3194 #ifdef CONFIG_ATM_FORE200E_PCA
3195 { "PCA-200E", "pca200e", 32, 4, 32,
3196 _fore200e_pca_fw_data, &_fore200e_pca_fw_size,
3197 fore200e_pca_read,
3198 fore200e_pca_write,
3199 fore200e_pca_dma_map,
3200 fore200e_pca_dma_unmap,
3201 fore200e_pca_dma_sync_for_cpu,
3202 fore200e_pca_dma_sync_for_device,
3203 fore200e_pca_dma_chunk_alloc,
3204 fore200e_pca_dma_chunk_free,
3205 NULL,
3206 fore200e_pca_configure,
3207 fore200e_pca_map,
3208 fore200e_pca_reset,
3209 fore200e_pca_prom_read,
3210 fore200e_pca_unmap,
3211 NULL,
3212 fore200e_pca_irq_check,
3213 fore200e_pca_irq_ack,
3214 fore200e_pca_proc_read,
3216 #endif
3217 #ifdef CONFIG_ATM_FORE200E_SBA
3218 { "SBA-200E", "sba200e", 32, 64, 32,
3219 _fore200e_sba_fw_data, &_fore200e_sba_fw_size,
3220 fore200e_sba_read,
3221 fore200e_sba_write,
3222 fore200e_sba_dma_map,
3223 fore200e_sba_dma_unmap,
3224 fore200e_sba_dma_sync_for_cpu,
3225 fore200e_sba_dma_sync_for_device,
3226 fore200e_sba_dma_chunk_alloc,
3227 fore200e_sba_dma_chunk_free,
3228 fore200e_sba_detect,
3229 fore200e_sba_configure,
3230 fore200e_sba_map,
3231 fore200e_sba_reset,
3232 fore200e_sba_prom_read,
3233 fore200e_sba_unmap,
3234 fore200e_sba_irq_enable,
3235 fore200e_sba_irq_check,
3236 fore200e_sba_irq_ack,
3237 fore200e_sba_proc_read,
3239 #endif
3243 #ifdef MODULE_LICENSE
3244 MODULE_LICENSE("GPL");
3245 #endif