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/kernel.h>
29 #include <linux/slab.h>
30 #include <linux/init.h>
31 #include <linux/capability.h>
32 #include <linux/interrupt.h>
33 #include <linux/bitops.h>
34 #include <linux/pci.h>
35 #include <linux/module.h>
36 #include <linux/atmdev.h>
37 #include <linux/sonet.h>
38 #include <linux/atm_suni.h>
39 #include <linux/dma-mapping.h>
40 #include <linux/delay.h>
42 #include <asm/string.h>
46 #include <asm/byteorder.h>
47 #include <asm/uaccess.h>
48 #include <asm/atomic.h>
50 #ifdef CONFIG_ATM_FORE200E_SBA
51 #include <asm/idprom.h>
53 #include <asm/openprom.h>
54 #include <asm/oplib.h>
55 #include <asm/pgtable.h>
58 #if defined(CONFIG_ATM_FORE200E_USE_TASKLET) /* defer interrupt work to a tasklet */
59 #define FORE200E_USE_TASKLET
62 #if 0 /* enable the debugging code of the buffer supply queues */
63 #define FORE200E_BSQ_DEBUG
66 #if 1 /* ensure correct handling of 52-byte AAL0 SDUs expected by atmdump-like apps */
67 #define FORE200E_52BYTE_AAL0_SDU
73 #define FORE200E_VERSION "0.3e"
75 #define FORE200E "fore200e: "
77 #if 0 /* override .config */
78 #define CONFIG_ATM_FORE200E_DEBUG 1
80 #if defined(CONFIG_ATM_FORE200E_DEBUG) && (CONFIG_ATM_FORE200E_DEBUG > 0)
81 #define DPRINTK(level, format, args...) do { if (CONFIG_ATM_FORE200E_DEBUG >= (level)) \
82 printk(FORE200E format, ##args); } while (0)
84 #define DPRINTK(level, format, args...) do {} while (0)
88 #define FORE200E_ALIGN(addr, alignment) \
89 ((((unsigned long)(addr) + (alignment - 1)) & ~(alignment - 1)) - (unsigned long)(addr))
91 #define FORE200E_DMA_INDEX(dma_addr, type, index) ((dma_addr) + (index) * sizeof(type))
93 #define FORE200E_INDEX(virt_addr, type, index) (&((type *)(virt_addr))[ index ])
95 #define FORE200E_NEXT_ENTRY(index, modulo) (index = ++(index) % (modulo))
98 #define ASSERT(expr) if (!(expr)) { \
99 printk(FORE200E "assertion failed! %s[%d]: %s\n", \
100 __FUNCTION__, __LINE__, #expr); \
101 panic(FORE200E "%s", __FUNCTION__); \
104 #define ASSERT(expr) do {} while (0)
108 static const struct atmdev_ops fore200e_ops;
109 static const struct fore200e_bus fore200e_bus[];
111 static LIST_HEAD(fore200e_boards);
114 MODULE_AUTHOR("Christophe Lizzi - credits to Uwe Dannowski and Heikki Vatiainen");
115 MODULE_DESCRIPTION("FORE Systems 200E-series ATM driver - version " FORE200E_VERSION);
116 MODULE_SUPPORTED_DEVICE("PCA-200E, SBA-200E");
119 static const int fore200e_rx_buf_nbr[ BUFFER_SCHEME_NBR ][ BUFFER_MAGN_NBR ] = {
120 { BUFFER_S1_NBR, BUFFER_L1_NBR },
121 { BUFFER_S2_NBR, BUFFER_L2_NBR }
124 static const int fore200e_rx_buf_size[ BUFFER_SCHEME_NBR ][ BUFFER_MAGN_NBR ] = {
125 { BUFFER_S1_SIZE, BUFFER_L1_SIZE },
126 { BUFFER_S2_SIZE, BUFFER_L2_SIZE }
130 #if defined(CONFIG_ATM_FORE200E_DEBUG) && (CONFIG_ATM_FORE200E_DEBUG > 0)
131 static const char* fore200e_traffic_class[] = { "NONE", "UBR", "CBR", "VBR", "ABR", "ANY" };
135 #if 0 /* currently unused */
137 fore200e_fore2atm_aal(enum fore200e_aal aal)
140 case FORE200E_AAL0: return ATM_AAL0;
141 case FORE200E_AAL34: return ATM_AAL34;
142 case FORE200E_AAL5: return ATM_AAL5;
150 static enum fore200e_aal
151 fore200e_atm2fore_aal(int aal)
154 case ATM_AAL0: return FORE200E_AAL0;
155 case ATM_AAL34: return FORE200E_AAL34;
158 case ATM_AAL5: return FORE200E_AAL5;
166 fore200e_irq_itoa(int irq)
169 sprintf(str, "%d", irq);
174 /* allocate and align a chunk of memory intended to hold the data behing exchanged
175 between the driver and the adapter (using streaming DVMA) */
178 fore200e_chunk_alloc(struct fore200e* fore200e, struct chunk* chunk, int size, int alignment, int direction)
180 unsigned long offset = 0;
182 if (alignment <= sizeof(int))
185 chunk->alloc_size = size + alignment;
186 chunk->align_size = size;
187 chunk->direction = direction;
189 chunk->alloc_addr = kzalloc(chunk->alloc_size, GFP_KERNEL | GFP_DMA);
190 if (chunk->alloc_addr == NULL)
194 offset = FORE200E_ALIGN(chunk->alloc_addr, alignment);
196 chunk->align_addr = chunk->alloc_addr + offset;
198 chunk->dma_addr = fore200e->bus->dma_map(fore200e, chunk->align_addr, chunk->align_size, direction);
204 /* free a chunk of memory */
207 fore200e_chunk_free(struct fore200e* fore200e, struct chunk* chunk)
209 fore200e->bus->dma_unmap(fore200e, chunk->dma_addr, chunk->dma_size, chunk->direction);
211 kfree(chunk->alloc_addr);
216 fore200e_spin(int msecs)
218 unsigned long timeout = jiffies + msecs_to_jiffies(msecs);
219 while (time_before(jiffies, timeout));
224 fore200e_poll(struct fore200e* fore200e, volatile u32* addr, u32 val, int msecs)
226 unsigned long timeout = jiffies + msecs_to_jiffies(msecs);
231 if ((ok = (*addr == val)) || (*addr & STATUS_ERROR))
234 } while (time_before(jiffies, timeout));
238 printk(FORE200E "cmd polling failed, got status 0x%08x, expected 0x%08x\n",
248 fore200e_io_poll(struct fore200e* fore200e, volatile u32 __iomem *addr, u32 val, int msecs)
250 unsigned long timeout = jiffies + msecs_to_jiffies(msecs);
254 if ((ok = (fore200e->bus->read(addr) == val)))
257 } while (time_before(jiffies, timeout));
261 printk(FORE200E "I/O polling failed, got status 0x%08x, expected 0x%08x\n",
262 fore200e->bus->read(addr), val);
271 fore200e_free_rx_buf(struct fore200e* fore200e)
273 int scheme, magn, nbr;
274 struct buffer* buffer;
276 for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
277 for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
279 if ((buffer = fore200e->host_bsq[ scheme ][ magn ].buffer) != NULL) {
281 for (nbr = 0; nbr < fore200e_rx_buf_nbr[ scheme ][ magn ]; nbr++) {
283 struct chunk* data = &buffer[ nbr ].data;
285 if (data->alloc_addr != NULL)
286 fore200e_chunk_free(fore200e, data);
295 fore200e_uninit_bs_queue(struct fore200e* fore200e)
299 for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
300 for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
302 struct chunk* status = &fore200e->host_bsq[ scheme ][ magn ].status;
303 struct chunk* rbd_block = &fore200e->host_bsq[ scheme ][ magn ].rbd_block;
305 if (status->alloc_addr)
306 fore200e->bus->dma_chunk_free(fore200e, status);
308 if (rbd_block->alloc_addr)
309 fore200e->bus->dma_chunk_free(fore200e, rbd_block);
316 fore200e_reset(struct fore200e* fore200e, int diag)
320 fore200e->cp_monitor = fore200e->virt_base + FORE200E_CP_MONITOR_OFFSET;
322 fore200e->bus->write(BSTAT_COLD_START, &fore200e->cp_monitor->bstat);
324 fore200e->bus->reset(fore200e);
327 ok = fore200e_io_poll(fore200e, &fore200e->cp_monitor->bstat, BSTAT_SELFTEST_OK, 1000);
330 printk(FORE200E "device %s self-test failed\n", fore200e->name);
334 printk(FORE200E "device %s self-test passed\n", fore200e->name);
336 fore200e->state = FORE200E_STATE_RESET;
344 fore200e_shutdown(struct fore200e* fore200e)
346 printk(FORE200E "removing device %s at 0x%lx, IRQ %s\n",
347 fore200e->name, fore200e->phys_base,
348 fore200e_irq_itoa(fore200e->irq));
350 if (fore200e->state > FORE200E_STATE_RESET) {
351 /* first, reset the board to prevent further interrupts or data transfers */
352 fore200e_reset(fore200e, 0);
355 /* then, release all allocated resources */
356 switch(fore200e->state) {
358 case FORE200E_STATE_COMPLETE:
359 kfree(fore200e->stats);
361 case FORE200E_STATE_IRQ:
362 free_irq(fore200e->irq, fore200e->atm_dev);
364 case FORE200E_STATE_ALLOC_BUF:
365 fore200e_free_rx_buf(fore200e);
367 case FORE200E_STATE_INIT_BSQ:
368 fore200e_uninit_bs_queue(fore200e);
370 case FORE200E_STATE_INIT_RXQ:
371 fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_rxq.status);
372 fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_rxq.rpd);
374 case FORE200E_STATE_INIT_TXQ:
375 fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_txq.status);
376 fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_txq.tpd);
378 case FORE200E_STATE_INIT_CMDQ:
379 fore200e->bus->dma_chunk_free(fore200e, &fore200e->host_cmdq.status);
381 case FORE200E_STATE_INITIALIZE:
382 /* nothing to do for that state */
384 case FORE200E_STATE_START_FW:
385 /* nothing to do for that state */
387 case FORE200E_STATE_LOAD_FW:
388 /* nothing to do for that state */
390 case FORE200E_STATE_RESET:
391 /* nothing to do for that state */
393 case FORE200E_STATE_MAP:
394 fore200e->bus->unmap(fore200e);
396 case FORE200E_STATE_CONFIGURE:
397 /* nothing to do for that state */
399 case FORE200E_STATE_REGISTER:
400 /* XXX shouldn't we *start* by deregistering the device? */
401 atm_dev_deregister(fore200e->atm_dev);
403 case FORE200E_STATE_BLANK:
404 /* nothing to do for that state */
410 #ifdef CONFIG_ATM_FORE200E_PCA
412 static u32 fore200e_pca_read(volatile u32 __iomem *addr)
414 /* on big-endian hosts, the board is configured to convert
415 the endianess of slave RAM accesses */
416 return le32_to_cpu(readl(addr));
420 static void fore200e_pca_write(u32 val, volatile u32 __iomem *addr)
422 /* on big-endian hosts, the board is configured to convert
423 the endianess of slave RAM accesses */
424 writel(cpu_to_le32(val), addr);
429 fore200e_pca_dma_map(struct fore200e* fore200e, void* virt_addr, int size, int direction)
431 u32 dma_addr = pci_map_single((struct pci_dev*)fore200e->bus_dev, virt_addr, size, direction);
433 DPRINTK(3, "PCI DVMA mapping: virt_addr = 0x%p, size = %d, direction = %d, --> dma_addr = 0x%08x\n",
434 virt_addr, size, direction, dma_addr);
441 fore200e_pca_dma_unmap(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
443 DPRINTK(3, "PCI DVMA unmapping: dma_addr = 0x%08x, size = %d, direction = %d\n",
444 dma_addr, size, direction);
446 pci_unmap_single((struct pci_dev*)fore200e->bus_dev, dma_addr, size, direction);
451 fore200e_pca_dma_sync_for_cpu(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
453 DPRINTK(3, "PCI DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction);
455 pci_dma_sync_single_for_cpu((struct pci_dev*)fore200e->bus_dev, dma_addr, size, direction);
459 fore200e_pca_dma_sync_for_device(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
461 DPRINTK(3, "PCI DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction);
463 pci_dma_sync_single_for_device((struct pci_dev*)fore200e->bus_dev, dma_addr, size, direction);
467 /* allocate a DMA consistent chunk of memory intended to act as a communication mechanism
468 (to hold descriptors, status, queues, etc.) shared by the driver and the adapter */
471 fore200e_pca_dma_chunk_alloc(struct fore200e* fore200e, struct chunk* chunk,
472 int size, int nbr, int alignment)
474 /* returned chunks are page-aligned */
475 chunk->alloc_size = size * nbr;
476 chunk->alloc_addr = pci_alloc_consistent((struct pci_dev*)fore200e->bus_dev,
480 if ((chunk->alloc_addr == NULL) || (chunk->dma_addr == 0))
483 chunk->align_addr = chunk->alloc_addr;
489 /* free a DMA consistent chunk of memory */
492 fore200e_pca_dma_chunk_free(struct fore200e* fore200e, struct chunk* chunk)
494 pci_free_consistent((struct pci_dev*)fore200e->bus_dev,
502 fore200e_pca_irq_check(struct fore200e* fore200e)
504 /* this is a 1 bit register */
505 int irq_posted = readl(fore200e->regs.pca.psr);
507 #if defined(CONFIG_ATM_FORE200E_DEBUG) && (CONFIG_ATM_FORE200E_DEBUG == 2)
508 if (irq_posted && (readl(fore200e->regs.pca.hcr) & PCA200E_HCR_OUTFULL)) {
509 DPRINTK(2,"FIFO OUT full, device %d\n", fore200e->atm_dev->number);
518 fore200e_pca_irq_ack(struct fore200e* fore200e)
520 writel(PCA200E_HCR_CLRINTR, fore200e->regs.pca.hcr);
525 fore200e_pca_reset(struct fore200e* fore200e)
527 writel(PCA200E_HCR_RESET, fore200e->regs.pca.hcr);
529 writel(0, fore200e->regs.pca.hcr);
534 fore200e_pca_map(struct fore200e* fore200e)
536 DPRINTK(2, "device %s being mapped in memory\n", fore200e->name);
538 fore200e->virt_base = ioremap(fore200e->phys_base, PCA200E_IOSPACE_LENGTH);
540 if (fore200e->virt_base == NULL) {
541 printk(FORE200E "can't map device %s\n", fore200e->name);
545 DPRINTK(1, "device %s mapped to 0x%p\n", fore200e->name, fore200e->virt_base);
547 /* gain access to the PCA specific registers */
548 fore200e->regs.pca.hcr = fore200e->virt_base + PCA200E_HCR_OFFSET;
549 fore200e->regs.pca.imr = fore200e->virt_base + PCA200E_IMR_OFFSET;
550 fore200e->regs.pca.psr = fore200e->virt_base + PCA200E_PSR_OFFSET;
552 fore200e->state = FORE200E_STATE_MAP;
558 fore200e_pca_unmap(struct fore200e* fore200e)
560 DPRINTK(2, "device %s being unmapped from memory\n", fore200e->name);
562 if (fore200e->virt_base != NULL)
563 iounmap(fore200e->virt_base);
568 fore200e_pca_configure(struct fore200e* fore200e)
570 struct pci_dev* pci_dev = (struct pci_dev*)fore200e->bus_dev;
571 u8 master_ctrl, latency;
573 DPRINTK(2, "device %s being configured\n", fore200e->name);
575 if ((pci_dev->irq == 0) || (pci_dev->irq == 0xFF)) {
576 printk(FORE200E "incorrect IRQ setting - misconfigured PCI-PCI bridge?\n");
580 pci_read_config_byte(pci_dev, PCA200E_PCI_MASTER_CTRL, &master_ctrl);
582 master_ctrl = master_ctrl
583 #if defined(__BIG_ENDIAN)
584 /* request the PCA board to convert the endianess of slave RAM accesses */
585 | PCA200E_CTRL_CONVERT_ENDIAN
588 | PCA200E_CTRL_DIS_CACHE_RD
589 | PCA200E_CTRL_DIS_WRT_INVAL
590 | PCA200E_CTRL_ENA_CONT_REQ_MODE
591 | PCA200E_CTRL_2_CACHE_WRT_INVAL
593 | PCA200E_CTRL_LARGE_PCI_BURSTS;
595 pci_write_config_byte(pci_dev, PCA200E_PCI_MASTER_CTRL, master_ctrl);
597 /* raise latency from 32 (default) to 192, as this seems to prevent NIC
598 lockups (under heavy rx loads) due to continuous 'FIFO OUT full' condition.
599 this may impact the performances of other PCI devices on the same bus, though */
601 pci_write_config_byte(pci_dev, PCI_LATENCY_TIMER, latency);
603 fore200e->state = FORE200E_STATE_CONFIGURE;
609 fore200e_pca_prom_read(struct fore200e* fore200e, struct prom_data* prom)
611 struct host_cmdq* cmdq = &fore200e->host_cmdq;
612 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
613 struct prom_opcode opcode;
617 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
619 opcode.opcode = OPCODE_GET_PROM;
622 prom_dma = fore200e->bus->dma_map(fore200e, prom, sizeof(struct prom_data), DMA_FROM_DEVICE);
624 fore200e->bus->write(prom_dma, &entry->cp_entry->cmd.prom_block.prom_haddr);
626 *entry->status = STATUS_PENDING;
628 fore200e->bus->write(*(u32*)&opcode, (u32 __iomem *)&entry->cp_entry->cmd.prom_block.opcode);
630 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
632 *entry->status = STATUS_FREE;
634 fore200e->bus->dma_unmap(fore200e, prom_dma, sizeof(struct prom_data), DMA_FROM_DEVICE);
637 printk(FORE200E "unable to get PROM data from device %s\n", fore200e->name);
641 #if defined(__BIG_ENDIAN)
643 #define swap_here(addr) (*((u32*)(addr)) = swab32( *((u32*)(addr)) ))
645 /* MAC address is stored as little-endian */
646 swap_here(&prom->mac_addr[0]);
647 swap_here(&prom->mac_addr[4]);
655 fore200e_pca_proc_read(struct fore200e* fore200e, char *page)
657 struct pci_dev* pci_dev = (struct pci_dev*)fore200e->bus_dev;
659 return sprintf(page, " PCI bus/slot/function:\t%d/%d/%d\n",
660 pci_dev->bus->number, PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn));
663 #endif /* CONFIG_ATM_FORE200E_PCA */
666 #ifdef CONFIG_ATM_FORE200E_SBA
669 fore200e_sba_read(volatile u32 __iomem *addr)
671 return sbus_readl(addr);
676 fore200e_sba_write(u32 val, volatile u32 __iomem *addr)
678 sbus_writel(val, addr);
683 fore200e_sba_dma_map(struct fore200e* fore200e, void* virt_addr, int size, int direction)
685 u32 dma_addr = sbus_map_single((struct sbus_dev*)fore200e->bus_dev, virt_addr, size, direction);
687 DPRINTK(3, "SBUS DVMA mapping: virt_addr = 0x%p, size = %d, direction = %d --> dma_addr = 0x%08x\n",
688 virt_addr, size, direction, dma_addr);
695 fore200e_sba_dma_unmap(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
697 DPRINTK(3, "SBUS DVMA unmapping: dma_addr = 0x%08x, size = %d, direction = %d,\n",
698 dma_addr, size, direction);
700 sbus_unmap_single((struct sbus_dev*)fore200e->bus_dev, dma_addr, size, direction);
705 fore200e_sba_dma_sync_for_cpu(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
707 DPRINTK(3, "SBUS DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction);
709 sbus_dma_sync_single_for_cpu((struct sbus_dev*)fore200e->bus_dev, dma_addr, size, direction);
713 fore200e_sba_dma_sync_for_device(struct fore200e* fore200e, u32 dma_addr, int size, int direction)
715 DPRINTK(3, "SBUS DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction);
717 sbus_dma_sync_single_for_device((struct sbus_dev*)fore200e->bus_dev, dma_addr, size, direction);
721 /* allocate a DVMA consistent chunk of memory intended to act as a communication mechanism
722 (to hold descriptors, status, queues, etc.) shared by the driver and the adapter */
725 fore200e_sba_dma_chunk_alloc(struct fore200e* fore200e, struct chunk* chunk,
726 int size, int nbr, int alignment)
728 chunk->alloc_size = chunk->align_size = size * nbr;
730 /* returned chunks are page-aligned */
731 chunk->alloc_addr = sbus_alloc_consistent((struct sbus_dev*)fore200e->bus_dev,
735 if ((chunk->alloc_addr == NULL) || (chunk->dma_addr == 0))
738 chunk->align_addr = chunk->alloc_addr;
744 /* free a DVMA consistent chunk of memory */
747 fore200e_sba_dma_chunk_free(struct fore200e* fore200e, struct chunk* chunk)
749 sbus_free_consistent((struct sbus_dev*)fore200e->bus_dev,
757 fore200e_sba_irq_enable(struct fore200e* fore200e)
759 u32 hcr = fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_STICKY;
760 fore200e->bus->write(hcr | SBA200E_HCR_INTR_ENA, fore200e->regs.sba.hcr);
765 fore200e_sba_irq_check(struct fore200e* fore200e)
767 return fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_INTR_REQ;
772 fore200e_sba_irq_ack(struct fore200e* fore200e)
774 u32 hcr = fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_STICKY;
775 fore200e->bus->write(hcr | SBA200E_HCR_INTR_CLR, fore200e->regs.sba.hcr);
780 fore200e_sba_reset(struct fore200e* fore200e)
782 fore200e->bus->write(SBA200E_HCR_RESET, fore200e->regs.sba.hcr);
784 fore200e->bus->write(0, fore200e->regs.sba.hcr);
789 fore200e_sba_map(struct fore200e* fore200e)
791 struct sbus_dev* sbus_dev = (struct sbus_dev*)fore200e->bus_dev;
794 /* gain access to the SBA specific registers */
795 fore200e->regs.sba.hcr = sbus_ioremap(&sbus_dev->resource[0], 0, SBA200E_HCR_LENGTH, "SBA HCR");
796 fore200e->regs.sba.bsr = sbus_ioremap(&sbus_dev->resource[1], 0, SBA200E_BSR_LENGTH, "SBA BSR");
797 fore200e->regs.sba.isr = sbus_ioremap(&sbus_dev->resource[2], 0, SBA200E_ISR_LENGTH, "SBA ISR");
798 fore200e->virt_base = sbus_ioremap(&sbus_dev->resource[3], 0, SBA200E_RAM_LENGTH, "SBA RAM");
800 if (fore200e->virt_base == NULL) {
801 printk(FORE200E "unable to map RAM of device %s\n", fore200e->name);
805 DPRINTK(1, "device %s mapped to 0x%p\n", fore200e->name, fore200e->virt_base);
807 fore200e->bus->write(0x02, fore200e->regs.sba.isr); /* XXX hardwired interrupt level */
809 /* get the supported DVMA burst sizes */
810 bursts = prom_getintdefault(sbus_dev->bus->prom_node, "burst-sizes", 0x00);
812 if (sbus_can_dma_64bit(sbus_dev))
813 sbus_set_sbus64(sbus_dev, bursts);
815 fore200e->state = FORE200E_STATE_MAP;
821 fore200e_sba_unmap(struct fore200e* fore200e)
823 sbus_iounmap(fore200e->regs.sba.hcr, SBA200E_HCR_LENGTH);
824 sbus_iounmap(fore200e->regs.sba.bsr, SBA200E_BSR_LENGTH);
825 sbus_iounmap(fore200e->regs.sba.isr, SBA200E_ISR_LENGTH);
826 sbus_iounmap(fore200e->virt_base, SBA200E_RAM_LENGTH);
831 fore200e_sba_configure(struct fore200e* fore200e)
833 fore200e->state = FORE200E_STATE_CONFIGURE;
838 static struct fore200e* __init
839 fore200e_sba_detect(const struct fore200e_bus* bus, int index)
841 struct fore200e* fore200e;
842 struct sbus_bus* sbus_bus;
843 struct sbus_dev* sbus_dev = NULL;
845 unsigned int count = 0;
847 for_each_sbus (sbus_bus) {
848 for_each_sbusdev (sbus_dev, sbus_bus) {
849 if (strcmp(sbus_dev->prom_name, SBA200E_PROM_NAME) == 0) {
859 if (sbus_dev->num_registers != 4) {
860 printk(FORE200E "this %s device has %d instead of 4 registers\n",
861 bus->model_name, sbus_dev->num_registers);
865 fore200e = kzalloc(sizeof(struct fore200e), GFP_KERNEL);
866 if (fore200e == NULL)
870 fore200e->bus_dev = sbus_dev;
871 fore200e->irq = sbus_dev->irqs[ 0 ];
873 fore200e->phys_base = (unsigned long)sbus_dev;
875 sprintf(fore200e->name, "%s-%d", bus->model_name, index - 1);
882 fore200e_sba_prom_read(struct fore200e* fore200e, struct prom_data* prom)
884 struct sbus_dev* sbus_dev = (struct sbus_dev*) fore200e->bus_dev;
887 len = prom_getproperty(sbus_dev->prom_node, "macaddrlo2", &prom->mac_addr[ 4 ], 4);
891 len = prom_getproperty(sbus_dev->prom_node, "macaddrhi4", &prom->mac_addr[ 2 ], 4);
895 prom_getproperty(sbus_dev->prom_node, "serialnumber",
896 (char*)&prom->serial_number, sizeof(prom->serial_number));
898 prom_getproperty(sbus_dev->prom_node, "promversion",
899 (char*)&prom->hw_revision, sizeof(prom->hw_revision));
906 fore200e_sba_proc_read(struct fore200e* fore200e, char *page)
908 struct sbus_dev* sbus_dev = (struct sbus_dev*)fore200e->bus_dev;
910 return sprintf(page, " SBUS slot/device:\t\t%d/'%s'\n", sbus_dev->slot, sbus_dev->prom_name);
912 #endif /* CONFIG_ATM_FORE200E_SBA */
916 fore200e_tx_irq(struct fore200e* fore200e)
918 struct host_txq* txq = &fore200e->host_txq;
919 struct host_txq_entry* entry;
921 struct fore200e_vc_map* vc_map;
923 if (fore200e->host_txq.txing == 0)
928 entry = &txq->host_entry[ txq->tail ];
930 if ((*entry->status & STATUS_COMPLETE) == 0) {
934 DPRINTK(3, "TX COMPLETED: entry = %p [tail = %d], vc_map = %p, skb = %p\n",
935 entry, txq->tail, entry->vc_map, entry->skb);
937 /* free copy of misaligned data */
940 /* remove DMA mapping */
941 fore200e->bus->dma_unmap(fore200e, entry->tpd->tsd[ 0 ].buffer, entry->tpd->tsd[ 0 ].length,
944 vc_map = entry->vc_map;
946 /* vcc closed since the time the entry was submitted for tx? */
947 if ((vc_map->vcc == NULL) ||
948 (test_bit(ATM_VF_READY, &vc_map->vcc->flags) == 0)) {
950 DPRINTK(1, "no ready vcc found for PDU sent on device %d\n",
951 fore200e->atm_dev->number);
953 dev_kfree_skb_any(entry->skb);
958 /* vcc closed then immediately re-opened? */
959 if (vc_map->incarn != entry->incarn) {
961 /* when a vcc is closed, some PDUs may be still pending in the tx queue.
962 if the same vcc is immediately re-opened, those pending PDUs must
963 not be popped after the completion of their emission, as they refer
964 to the prior incarnation of that vcc. otherwise, sk_atm(vcc)->sk_wmem_alloc
965 would be decremented by the size of the (unrelated) skb, possibly
966 leading to a negative sk->sk_wmem_alloc count, ultimately freezing the vcc.
967 we thus bind the tx entry to the current incarnation of the vcc
968 when the entry is submitted for tx. When the tx later completes,
969 if the incarnation number of the tx entry does not match the one
970 of the vcc, then this implies that the vcc has been closed then re-opened.
971 we thus just drop the skb here. */
973 DPRINTK(1, "vcc closed-then-re-opened; dropping PDU sent on device %d\n",
974 fore200e->atm_dev->number);
976 dev_kfree_skb_any(entry->skb);
982 /* notify tx completion */
984 vcc->pop(vcc, entry->skb);
987 dev_kfree_skb_any(entry->skb);
990 /* race fixed by the above incarnation mechanism, but... */
991 if (atomic_read(&sk_atm(vcc)->sk_wmem_alloc) < 0) {
992 atomic_set(&sk_atm(vcc)->sk_wmem_alloc, 0);
995 /* check error condition */
996 if (*entry->status & STATUS_ERROR)
997 atomic_inc(&vcc->stats->tx_err);
999 atomic_inc(&vcc->stats->tx);
1003 *entry->status = STATUS_FREE;
1005 fore200e->host_txq.txing--;
1007 FORE200E_NEXT_ENTRY(txq->tail, QUEUE_SIZE_TX);
1012 #ifdef FORE200E_BSQ_DEBUG
1013 int bsq_audit(int where, struct host_bsq* bsq, int scheme, int magn)
1015 struct buffer* buffer;
1018 buffer = bsq->freebuf;
1021 if (buffer->supplied) {
1022 printk(FORE200E "bsq_audit(%d): queue %d.%d, buffer %ld supplied but in free list!\n",
1023 where, scheme, magn, buffer->index);
1026 if (buffer->magn != magn) {
1027 printk(FORE200E "bsq_audit(%d): queue %d.%d, buffer %ld, unexpected magn = %d\n",
1028 where, scheme, magn, buffer->index, buffer->magn);
1031 if (buffer->scheme != scheme) {
1032 printk(FORE200E "bsq_audit(%d): queue %d.%d, buffer %ld, unexpected scheme = %d\n",
1033 where, scheme, magn, buffer->index, buffer->scheme);
1036 if ((buffer->index < 0) || (buffer->index >= fore200e_rx_buf_nbr[ scheme ][ magn ])) {
1037 printk(FORE200E "bsq_audit(%d): queue %d.%d, out of range buffer index = %ld !\n",
1038 where, scheme, magn, buffer->index);
1042 buffer = buffer->next;
1045 if (count != bsq->freebuf_count) {
1046 printk(FORE200E "bsq_audit(%d): queue %d.%d, %d bufs in free list, but freebuf_count = %d\n",
1047 where, scheme, magn, count, bsq->freebuf_count);
1055 fore200e_supply(struct fore200e* fore200e)
1057 int scheme, magn, i;
1059 struct host_bsq* bsq;
1060 struct host_bsq_entry* entry;
1061 struct buffer* buffer;
1063 for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
1064 for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
1066 bsq = &fore200e->host_bsq[ scheme ][ magn ];
1068 #ifdef FORE200E_BSQ_DEBUG
1069 bsq_audit(1, bsq, scheme, magn);
1071 while (bsq->freebuf_count >= RBD_BLK_SIZE) {
1073 DPRINTK(2, "supplying %d rx buffers to queue %d / %d, freebuf_count = %d\n",
1074 RBD_BLK_SIZE, scheme, magn, bsq->freebuf_count);
1076 entry = &bsq->host_entry[ bsq->head ];
1078 for (i = 0; i < RBD_BLK_SIZE; i++) {
1080 /* take the first buffer in the free buffer list */
1081 buffer = bsq->freebuf;
1083 printk(FORE200E "no more free bufs in queue %d.%d, but freebuf_count = %d\n",
1084 scheme, magn, bsq->freebuf_count);
1087 bsq->freebuf = buffer->next;
1089 #ifdef FORE200E_BSQ_DEBUG
1090 if (buffer->supplied)
1091 printk(FORE200E "queue %d.%d, buffer %lu already supplied\n",
1092 scheme, magn, buffer->index);
1093 buffer->supplied = 1;
1095 entry->rbd_block->rbd[ i ].buffer_haddr = buffer->data.dma_addr;
1096 entry->rbd_block->rbd[ i ].handle = FORE200E_BUF2HDL(buffer);
1099 FORE200E_NEXT_ENTRY(bsq->head, QUEUE_SIZE_BS);
1101 /* decrease accordingly the number of free rx buffers */
1102 bsq->freebuf_count -= RBD_BLK_SIZE;
1104 *entry->status = STATUS_PENDING;
1105 fore200e->bus->write(entry->rbd_block_dma, &entry->cp_entry->rbd_block_haddr);
1113 fore200e_push_rpd(struct fore200e* fore200e, struct atm_vcc* vcc, struct rpd* rpd)
1115 struct sk_buff* skb;
1116 struct buffer* buffer;
1117 struct fore200e_vcc* fore200e_vcc;
1119 #ifdef FORE200E_52BYTE_AAL0_SDU
1120 u32 cell_header = 0;
1125 fore200e_vcc = FORE200E_VCC(vcc);
1126 ASSERT(fore200e_vcc);
1128 #ifdef FORE200E_52BYTE_AAL0_SDU
1129 if ((vcc->qos.aal == ATM_AAL0) && (vcc->qos.rxtp.max_sdu == ATM_AAL0_SDU)) {
1131 cell_header = (rpd->atm_header.gfc << ATM_HDR_GFC_SHIFT) |
1132 (rpd->atm_header.vpi << ATM_HDR_VPI_SHIFT) |
1133 (rpd->atm_header.vci << ATM_HDR_VCI_SHIFT) |
1134 (rpd->atm_header.plt << ATM_HDR_PTI_SHIFT) |
1135 rpd->atm_header.clp;
1140 /* compute total PDU length */
1141 for (i = 0; i < rpd->nseg; i++)
1142 pdu_len += rpd->rsd[ i ].length;
1144 skb = alloc_skb(pdu_len, GFP_ATOMIC);
1146 DPRINTK(2, "unable to alloc new skb, rx PDU length = %d\n", pdu_len);
1148 atomic_inc(&vcc->stats->rx_drop);
1152 __net_timestamp(skb);
1154 #ifdef FORE200E_52BYTE_AAL0_SDU
1156 *((u32*)skb_put(skb, 4)) = cell_header;
1160 /* reassemble segments */
1161 for (i = 0; i < rpd->nseg; i++) {
1163 /* rebuild rx buffer address from rsd handle */
1164 buffer = FORE200E_HDL2BUF(rpd->rsd[ i ].handle);
1166 /* Make device DMA transfer visible to CPU. */
1167 fore200e->bus->dma_sync_for_cpu(fore200e, buffer->data.dma_addr, rpd->rsd[ i ].length, DMA_FROM_DEVICE);
1169 memcpy(skb_put(skb, rpd->rsd[ i ].length), buffer->data.align_addr, rpd->rsd[ i ].length);
1171 /* Now let the device get at it again. */
1172 fore200e->bus->dma_sync_for_device(fore200e, buffer->data.dma_addr, rpd->rsd[ i ].length, DMA_FROM_DEVICE);
1175 DPRINTK(3, "rx skb: len = %d, truesize = %d\n", skb->len, skb->truesize);
1177 if (pdu_len < fore200e_vcc->rx_min_pdu)
1178 fore200e_vcc->rx_min_pdu = pdu_len;
1179 if (pdu_len > fore200e_vcc->rx_max_pdu)
1180 fore200e_vcc->rx_max_pdu = pdu_len;
1181 fore200e_vcc->rx_pdu++;
1184 if (atm_charge(vcc, skb->truesize) == 0) {
1186 DPRINTK(2, "receive buffers saturated for %d.%d.%d - PDU dropped\n",
1187 vcc->itf, vcc->vpi, vcc->vci);
1189 dev_kfree_skb_any(skb);
1191 atomic_inc(&vcc->stats->rx_drop);
1195 ASSERT(atomic_read(&sk_atm(vcc)->sk_wmem_alloc) >= 0);
1197 vcc->push(vcc, skb);
1198 atomic_inc(&vcc->stats->rx);
1200 ASSERT(atomic_read(&sk_atm(vcc)->sk_wmem_alloc) >= 0);
1207 fore200e_collect_rpd(struct fore200e* fore200e, struct rpd* rpd)
1209 struct host_bsq* bsq;
1210 struct buffer* buffer;
1213 for (i = 0; i < rpd->nseg; i++) {
1215 /* rebuild rx buffer address from rsd handle */
1216 buffer = FORE200E_HDL2BUF(rpd->rsd[ i ].handle);
1218 bsq = &fore200e->host_bsq[ buffer->scheme ][ buffer->magn ];
1220 #ifdef FORE200E_BSQ_DEBUG
1221 bsq_audit(2, bsq, buffer->scheme, buffer->magn);
1223 if (buffer->supplied == 0)
1224 printk(FORE200E "queue %d.%d, buffer %ld was not supplied\n",
1225 buffer->scheme, buffer->magn, buffer->index);
1226 buffer->supplied = 0;
1229 /* re-insert the buffer into the free buffer list */
1230 buffer->next = bsq->freebuf;
1231 bsq->freebuf = buffer;
1233 /* then increment the number of free rx buffers */
1234 bsq->freebuf_count++;
1240 fore200e_rx_irq(struct fore200e* fore200e)
1242 struct host_rxq* rxq = &fore200e->host_rxq;
1243 struct host_rxq_entry* entry;
1244 struct atm_vcc* vcc;
1245 struct fore200e_vc_map* vc_map;
1249 entry = &rxq->host_entry[ rxq->head ];
1251 /* no more received PDUs */
1252 if ((*entry->status & STATUS_COMPLETE) == 0)
1255 vc_map = FORE200E_VC_MAP(fore200e, entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci);
1257 if ((vc_map->vcc == NULL) ||
1258 (test_bit(ATM_VF_READY, &vc_map->vcc->flags) == 0)) {
1260 DPRINTK(1, "no ready VC found for PDU received on %d.%d.%d\n",
1261 fore200e->atm_dev->number,
1262 entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci);
1268 if ((*entry->status & STATUS_ERROR) == 0) {
1270 fore200e_push_rpd(fore200e, vcc, entry->rpd);
1273 DPRINTK(2, "damaged PDU on %d.%d.%d\n",
1274 fore200e->atm_dev->number,
1275 entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci);
1276 atomic_inc(&vcc->stats->rx_err);
1280 FORE200E_NEXT_ENTRY(rxq->head, QUEUE_SIZE_RX);
1282 fore200e_collect_rpd(fore200e, entry->rpd);
1284 /* rewrite the rpd address to ack the received PDU */
1285 fore200e->bus->write(entry->rpd_dma, &entry->cp_entry->rpd_haddr);
1286 *entry->status = STATUS_FREE;
1288 fore200e_supply(fore200e);
1293 #ifndef FORE200E_USE_TASKLET
1295 fore200e_irq(struct fore200e* fore200e)
1297 unsigned long flags;
1299 spin_lock_irqsave(&fore200e->q_lock, flags);
1300 fore200e_rx_irq(fore200e);
1301 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1303 spin_lock_irqsave(&fore200e->q_lock, flags);
1304 fore200e_tx_irq(fore200e);
1305 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1311 fore200e_interrupt(int irq, void* dev)
1313 struct fore200e* fore200e = FORE200E_DEV((struct atm_dev*)dev);
1315 if (fore200e->bus->irq_check(fore200e) == 0) {
1317 DPRINTK(3, "interrupt NOT triggered by device %d\n", fore200e->atm_dev->number);
1320 DPRINTK(3, "interrupt triggered by device %d\n", fore200e->atm_dev->number);
1322 #ifdef FORE200E_USE_TASKLET
1323 tasklet_schedule(&fore200e->tx_tasklet);
1324 tasklet_schedule(&fore200e->rx_tasklet);
1326 fore200e_irq(fore200e);
1329 fore200e->bus->irq_ack(fore200e);
1334 #ifdef FORE200E_USE_TASKLET
1336 fore200e_tx_tasklet(unsigned long data)
1338 struct fore200e* fore200e = (struct fore200e*) data;
1339 unsigned long flags;
1341 DPRINTK(3, "tx tasklet scheduled for device %d\n", fore200e->atm_dev->number);
1343 spin_lock_irqsave(&fore200e->q_lock, flags);
1344 fore200e_tx_irq(fore200e);
1345 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1350 fore200e_rx_tasklet(unsigned long data)
1352 struct fore200e* fore200e = (struct fore200e*) data;
1353 unsigned long flags;
1355 DPRINTK(3, "rx tasklet scheduled for device %d\n", fore200e->atm_dev->number);
1357 spin_lock_irqsave(&fore200e->q_lock, flags);
1358 fore200e_rx_irq((struct fore200e*) data);
1359 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1365 fore200e_select_scheme(struct atm_vcc* vcc)
1367 /* fairly balance the VCs over (identical) buffer schemes */
1368 int scheme = vcc->vci % 2 ? BUFFER_SCHEME_ONE : BUFFER_SCHEME_TWO;
1370 DPRINTK(1, "VC %d.%d.%d uses buffer scheme %d\n",
1371 vcc->itf, vcc->vpi, vcc->vci, scheme);
1378 fore200e_activate_vcin(struct fore200e* fore200e, int activate, struct atm_vcc* vcc, int mtu)
1380 struct host_cmdq* cmdq = &fore200e->host_cmdq;
1381 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
1382 struct activate_opcode activ_opcode;
1383 struct deactivate_opcode deactiv_opcode;
1386 enum fore200e_aal aal = fore200e_atm2fore_aal(vcc->qos.aal);
1388 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
1391 FORE200E_VCC(vcc)->scheme = fore200e_select_scheme(vcc);
1393 activ_opcode.opcode = OPCODE_ACTIVATE_VCIN;
1394 activ_opcode.aal = aal;
1395 activ_opcode.scheme = FORE200E_VCC(vcc)->scheme;
1396 activ_opcode.pad = 0;
1399 deactiv_opcode.opcode = OPCODE_DEACTIVATE_VCIN;
1400 deactiv_opcode.pad = 0;
1403 vpvc.vci = vcc->vci;
1404 vpvc.vpi = vcc->vpi;
1406 *entry->status = STATUS_PENDING;
1410 #ifdef FORE200E_52BYTE_AAL0_SDU
1413 /* the MTU is not used by the cp, except in the case of AAL0 */
1414 fore200e->bus->write(mtu, &entry->cp_entry->cmd.activate_block.mtu);
1415 fore200e->bus->write(*(u32*)&vpvc, (u32 __iomem *)&entry->cp_entry->cmd.activate_block.vpvc);
1416 fore200e->bus->write(*(u32*)&activ_opcode, (u32 __iomem *)&entry->cp_entry->cmd.activate_block.opcode);
1419 fore200e->bus->write(*(u32*)&vpvc, (u32 __iomem *)&entry->cp_entry->cmd.deactivate_block.vpvc);
1420 fore200e->bus->write(*(u32*)&deactiv_opcode, (u32 __iomem *)&entry->cp_entry->cmd.deactivate_block.opcode);
1423 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
1425 *entry->status = STATUS_FREE;
1428 printk(FORE200E "unable to %s VC %d.%d.%d\n",
1429 activate ? "open" : "close", vcc->itf, vcc->vpi, vcc->vci);
1433 DPRINTK(1, "VC %d.%d.%d %sed\n", vcc->itf, vcc->vpi, vcc->vci,
1434 activate ? "open" : "clos");
1440 #define FORE200E_MAX_BACK2BACK_CELLS 255 /* XXX depends on CDVT */
1443 fore200e_rate_ctrl(struct atm_qos* qos, struct tpd_rate* rate)
1445 if (qos->txtp.max_pcr < ATM_OC3_PCR) {
1447 /* compute the data cells to idle cells ratio from the tx PCR */
1448 rate->data_cells = qos->txtp.max_pcr * FORE200E_MAX_BACK2BACK_CELLS / ATM_OC3_PCR;
1449 rate->idle_cells = FORE200E_MAX_BACK2BACK_CELLS - rate->data_cells;
1452 /* disable rate control */
1453 rate->data_cells = rate->idle_cells = 0;
1459 fore200e_open(struct atm_vcc *vcc)
1461 struct fore200e* fore200e = FORE200E_DEV(vcc->dev);
1462 struct fore200e_vcc* fore200e_vcc;
1463 struct fore200e_vc_map* vc_map;
1464 unsigned long flags;
1466 short vpi = vcc->vpi;
1468 ASSERT((vpi >= 0) && (vpi < 1<<FORE200E_VPI_BITS));
1469 ASSERT((vci >= 0) && (vci < 1<<FORE200E_VCI_BITS));
1471 spin_lock_irqsave(&fore200e->q_lock, flags);
1473 vc_map = FORE200E_VC_MAP(fore200e, vpi, vci);
1476 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1478 printk(FORE200E "VC %d.%d.%d already in use\n",
1479 fore200e->atm_dev->number, vpi, vci);
1486 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1488 fore200e_vcc = kzalloc(sizeof(struct fore200e_vcc), GFP_ATOMIC);
1489 if (fore200e_vcc == NULL) {
1494 DPRINTK(2, "opening %d.%d.%d:%d QoS = (tx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d; "
1495 "rx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d)\n",
1496 vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal),
1497 fore200e_traffic_class[ vcc->qos.txtp.traffic_class ],
1498 vcc->qos.txtp.min_pcr, vcc->qos.txtp.max_pcr, vcc->qos.txtp.max_cdv, vcc->qos.txtp.max_sdu,
1499 fore200e_traffic_class[ vcc->qos.rxtp.traffic_class ],
1500 vcc->qos.rxtp.min_pcr, vcc->qos.rxtp.max_pcr, vcc->qos.rxtp.max_cdv, vcc->qos.rxtp.max_sdu);
1502 /* pseudo-CBR bandwidth requested? */
1503 if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) {
1505 down(&fore200e->rate_sf);
1506 if (fore200e->available_cell_rate < vcc->qos.txtp.max_pcr) {
1507 up(&fore200e->rate_sf);
1509 kfree(fore200e_vcc);
1514 /* reserve bandwidth */
1515 fore200e->available_cell_rate -= vcc->qos.txtp.max_pcr;
1516 up(&fore200e->rate_sf);
1519 vcc->itf = vcc->dev->number;
1521 set_bit(ATM_VF_PARTIAL,&vcc->flags);
1522 set_bit(ATM_VF_ADDR, &vcc->flags);
1524 vcc->dev_data = fore200e_vcc;
1526 if (fore200e_activate_vcin(fore200e, 1, vcc, vcc->qos.rxtp.max_sdu) < 0) {
1530 clear_bit(ATM_VF_ADDR, &vcc->flags);
1531 clear_bit(ATM_VF_PARTIAL,&vcc->flags);
1533 vcc->dev_data = NULL;
1535 fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
1537 kfree(fore200e_vcc);
1541 /* compute rate control parameters */
1542 if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) {
1544 fore200e_rate_ctrl(&vcc->qos, &fore200e_vcc->rate);
1545 set_bit(ATM_VF_HASQOS, &vcc->flags);
1547 DPRINTK(3, "tx on %d.%d.%d:%d, tx PCR = %d, rx PCR = %d, data_cells = %u, idle_cells = %u\n",
1548 vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal),
1549 vcc->qos.txtp.max_pcr, vcc->qos.rxtp.max_pcr,
1550 fore200e_vcc->rate.data_cells, fore200e_vcc->rate.idle_cells);
1553 fore200e_vcc->tx_min_pdu = fore200e_vcc->rx_min_pdu = MAX_PDU_SIZE + 1;
1554 fore200e_vcc->tx_max_pdu = fore200e_vcc->rx_max_pdu = 0;
1555 fore200e_vcc->tx_pdu = fore200e_vcc->rx_pdu = 0;
1557 /* new incarnation of the vcc */
1558 vc_map->incarn = ++fore200e->incarn_count;
1560 /* VC unusable before this flag is set */
1561 set_bit(ATM_VF_READY, &vcc->flags);
1568 fore200e_close(struct atm_vcc* vcc)
1570 struct fore200e* fore200e = FORE200E_DEV(vcc->dev);
1571 struct fore200e_vcc* fore200e_vcc;
1572 struct fore200e_vc_map* vc_map;
1573 unsigned long flags;
1576 ASSERT((vcc->vpi >= 0) && (vcc->vpi < 1<<FORE200E_VPI_BITS));
1577 ASSERT((vcc->vci >= 0) && (vcc->vci < 1<<FORE200E_VCI_BITS));
1579 DPRINTK(2, "closing %d.%d.%d:%d\n", vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal));
1581 clear_bit(ATM_VF_READY, &vcc->flags);
1583 fore200e_activate_vcin(fore200e, 0, vcc, 0);
1585 spin_lock_irqsave(&fore200e->q_lock, flags);
1587 vc_map = FORE200E_VC_MAP(fore200e, vcc->vpi, vcc->vci);
1589 /* the vc is no longer considered as "in use" by fore200e_open() */
1592 vcc->itf = vcc->vci = vcc->vpi = 0;
1594 fore200e_vcc = FORE200E_VCC(vcc);
1595 vcc->dev_data = NULL;
1597 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1599 /* release reserved bandwidth, if any */
1600 if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) {
1602 down(&fore200e->rate_sf);
1603 fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
1604 up(&fore200e->rate_sf);
1606 clear_bit(ATM_VF_HASQOS, &vcc->flags);
1609 clear_bit(ATM_VF_ADDR, &vcc->flags);
1610 clear_bit(ATM_VF_PARTIAL,&vcc->flags);
1612 ASSERT(fore200e_vcc);
1613 kfree(fore200e_vcc);
1618 fore200e_send(struct atm_vcc *vcc, struct sk_buff *skb)
1620 struct fore200e* fore200e = FORE200E_DEV(vcc->dev);
1621 struct fore200e_vcc* fore200e_vcc = FORE200E_VCC(vcc);
1622 struct fore200e_vc_map* vc_map;
1623 struct host_txq* txq = &fore200e->host_txq;
1624 struct host_txq_entry* entry;
1626 struct tpd_haddr tpd_haddr;
1627 int retry = CONFIG_ATM_FORE200E_TX_RETRY;
1629 int tx_len = skb->len;
1630 u32* cell_header = NULL;
1631 unsigned char* skb_data;
1633 unsigned char* data;
1634 unsigned long flags;
1637 ASSERT(atomic_read(&sk_atm(vcc)->sk_wmem_alloc) >= 0);
1639 ASSERT(fore200e_vcc);
1641 if (!test_bit(ATM_VF_READY, &vcc->flags)) {
1642 DPRINTK(1, "VC %d.%d.%d not ready for tx\n", vcc->itf, vcc->vpi, vcc->vpi);
1643 dev_kfree_skb_any(skb);
1647 #ifdef FORE200E_52BYTE_AAL0_SDU
1648 if ((vcc->qos.aal == ATM_AAL0) && (vcc->qos.txtp.max_sdu == ATM_AAL0_SDU)) {
1649 cell_header = (u32*) skb->data;
1650 skb_data = skb->data + 4; /* skip 4-byte cell header */
1651 skb_len = tx_len = skb->len - 4;
1653 DPRINTK(3, "user-supplied cell header = 0x%08x\n", *cell_header);
1658 skb_data = skb->data;
1662 if (((unsigned long)skb_data) & 0x3) {
1664 DPRINTK(2, "misaligned tx PDU on device %s\n", fore200e->name);
1669 if ((vcc->qos.aal == ATM_AAL0) && (skb_len % ATM_CELL_PAYLOAD)) {
1671 /* this simply NUKES the PCA board */
1672 DPRINTK(2, "incomplete tx AAL0 PDU on device %s\n", fore200e->name);
1674 tx_len = ((skb_len / ATM_CELL_PAYLOAD) + 1) * ATM_CELL_PAYLOAD;
1678 data = kmalloc(tx_len, GFP_ATOMIC | GFP_DMA);
1684 dev_kfree_skb_any(skb);
1689 memcpy(data, skb_data, skb_len);
1690 if (skb_len < tx_len)
1691 memset(data + skb_len, 0x00, tx_len - skb_len);
1697 vc_map = FORE200E_VC_MAP(fore200e, vcc->vpi, vcc->vci);
1698 ASSERT(vc_map->vcc == vcc);
1702 spin_lock_irqsave(&fore200e->q_lock, flags);
1704 entry = &txq->host_entry[ txq->head ];
1706 if ((*entry->status != STATUS_FREE) || (txq->txing >= QUEUE_SIZE_TX - 2)) {
1708 /* try to free completed tx queue entries */
1709 fore200e_tx_irq(fore200e);
1711 if (*entry->status != STATUS_FREE) {
1713 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1715 /* retry once again? */
1721 atomic_inc(&vcc->stats->tx_err);
1724 DPRINTK(2, "tx queue of device %s is saturated, PDU dropped - heartbeat is %08x\n",
1725 fore200e->name, fore200e->cp_queues->heartbeat);
1730 dev_kfree_skb_any(skb);
1740 entry->incarn = vc_map->incarn;
1741 entry->vc_map = vc_map;
1743 entry->data = tx_copy ? data : NULL;
1746 tpd->tsd[ 0 ].buffer = fore200e->bus->dma_map(fore200e, data, tx_len, DMA_TO_DEVICE);
1747 tpd->tsd[ 0 ].length = tx_len;
1749 FORE200E_NEXT_ENTRY(txq->head, QUEUE_SIZE_TX);
1752 /* The dma_map call above implies a dma_sync so the device can use it,
1753 * thus no explicit dma_sync call is necessary here.
1756 DPRINTK(3, "tx on %d.%d.%d:%d, len = %u (%u)\n",
1757 vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal),
1758 tpd->tsd[0].length, skb_len);
1760 if (skb_len < fore200e_vcc->tx_min_pdu)
1761 fore200e_vcc->tx_min_pdu = skb_len;
1762 if (skb_len > fore200e_vcc->tx_max_pdu)
1763 fore200e_vcc->tx_max_pdu = skb_len;
1764 fore200e_vcc->tx_pdu++;
1766 /* set tx rate control information */
1767 tpd->rate.data_cells = fore200e_vcc->rate.data_cells;
1768 tpd->rate.idle_cells = fore200e_vcc->rate.idle_cells;
1771 tpd->atm_header.clp = (*cell_header & ATM_HDR_CLP);
1772 tpd->atm_header.plt = (*cell_header & ATM_HDR_PTI_MASK) >> ATM_HDR_PTI_SHIFT;
1773 tpd->atm_header.vci = (*cell_header & ATM_HDR_VCI_MASK) >> ATM_HDR_VCI_SHIFT;
1774 tpd->atm_header.vpi = (*cell_header & ATM_HDR_VPI_MASK) >> ATM_HDR_VPI_SHIFT;
1775 tpd->atm_header.gfc = (*cell_header & ATM_HDR_GFC_MASK) >> ATM_HDR_GFC_SHIFT;
1778 /* set the ATM header, common to all cells conveying the PDU */
1779 tpd->atm_header.clp = 0;
1780 tpd->atm_header.plt = 0;
1781 tpd->atm_header.vci = vcc->vci;
1782 tpd->atm_header.vpi = vcc->vpi;
1783 tpd->atm_header.gfc = 0;
1786 tpd->spec.length = tx_len;
1788 tpd->spec.aal = fore200e_atm2fore_aal(vcc->qos.aal);
1791 tpd_haddr.size = sizeof(struct tpd) / (1<<TPD_HADDR_SHIFT); /* size is expressed in 32 byte blocks */
1793 tpd_haddr.haddr = entry->tpd_dma >> TPD_HADDR_SHIFT; /* shift the address, as we are in a bitfield */
1795 *entry->status = STATUS_PENDING;
1796 fore200e->bus->write(*(u32*)&tpd_haddr, (u32 __iomem *)&entry->cp_entry->tpd_haddr);
1798 spin_unlock_irqrestore(&fore200e->q_lock, flags);
1805 fore200e_getstats(struct fore200e* fore200e)
1807 struct host_cmdq* cmdq = &fore200e->host_cmdq;
1808 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
1809 struct stats_opcode opcode;
1813 if (fore200e->stats == NULL) {
1814 fore200e->stats = kzalloc(sizeof(struct stats), GFP_KERNEL | GFP_DMA);
1815 if (fore200e->stats == NULL)
1819 stats_dma_addr = fore200e->bus->dma_map(fore200e, fore200e->stats,
1820 sizeof(struct stats), DMA_FROM_DEVICE);
1822 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
1824 opcode.opcode = OPCODE_GET_STATS;
1827 fore200e->bus->write(stats_dma_addr, &entry->cp_entry->cmd.stats_block.stats_haddr);
1829 *entry->status = STATUS_PENDING;
1831 fore200e->bus->write(*(u32*)&opcode, (u32 __iomem *)&entry->cp_entry->cmd.stats_block.opcode);
1833 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
1835 *entry->status = STATUS_FREE;
1837 fore200e->bus->dma_unmap(fore200e, stats_dma_addr, sizeof(struct stats), DMA_FROM_DEVICE);
1840 printk(FORE200E "unable to get statistics from device %s\n", fore200e->name);
1849 fore200e_getsockopt(struct atm_vcc* vcc, int level, int optname, void __user *optval, int optlen)
1851 /* struct fore200e* fore200e = FORE200E_DEV(vcc->dev); */
1853 DPRINTK(2, "getsockopt %d.%d.%d, level = %d, optname = 0x%x, optval = 0x%p, optlen = %d\n",
1854 vcc->itf, vcc->vpi, vcc->vci, level, optname, optval, optlen);
1861 fore200e_setsockopt(struct atm_vcc* vcc, int level, int optname, void __user *optval, int optlen)
1863 /* struct fore200e* fore200e = FORE200E_DEV(vcc->dev); */
1865 DPRINTK(2, "setsockopt %d.%d.%d, level = %d, optname = 0x%x, optval = 0x%p, optlen = %d\n",
1866 vcc->itf, vcc->vpi, vcc->vci, level, optname, optval, optlen);
1872 #if 0 /* currently unused */
1874 fore200e_get_oc3(struct fore200e* fore200e, struct oc3_regs* regs)
1876 struct host_cmdq* cmdq = &fore200e->host_cmdq;
1877 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
1878 struct oc3_opcode opcode;
1880 u32 oc3_regs_dma_addr;
1882 oc3_regs_dma_addr = fore200e->bus->dma_map(fore200e, regs, sizeof(struct oc3_regs), DMA_FROM_DEVICE);
1884 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
1886 opcode.opcode = OPCODE_GET_OC3;
1891 fore200e->bus->write(oc3_regs_dma_addr, &entry->cp_entry->cmd.oc3_block.regs_haddr);
1893 *entry->status = STATUS_PENDING;
1895 fore200e->bus->write(*(u32*)&opcode, (u32*)&entry->cp_entry->cmd.oc3_block.opcode);
1897 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
1899 *entry->status = STATUS_FREE;
1901 fore200e->bus->dma_unmap(fore200e, oc3_regs_dma_addr, sizeof(struct oc3_regs), DMA_FROM_DEVICE);
1904 printk(FORE200E "unable to get OC-3 regs of device %s\n", fore200e->name);
1914 fore200e_set_oc3(struct fore200e* fore200e, u32 reg, u32 value, u32 mask)
1916 struct host_cmdq* cmdq = &fore200e->host_cmdq;
1917 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
1918 struct oc3_opcode opcode;
1921 DPRINTK(2, "set OC-3 reg = 0x%02x, value = 0x%02x, mask = 0x%02x\n", reg, value, mask);
1923 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
1925 opcode.opcode = OPCODE_SET_OC3;
1927 opcode.value = value;
1930 fore200e->bus->write(0, &entry->cp_entry->cmd.oc3_block.regs_haddr);
1932 *entry->status = STATUS_PENDING;
1934 fore200e->bus->write(*(u32*)&opcode, (u32 __iomem *)&entry->cp_entry->cmd.oc3_block.opcode);
1936 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
1938 *entry->status = STATUS_FREE;
1941 printk(FORE200E "unable to set OC-3 reg 0x%02x of device %s\n", reg, fore200e->name);
1950 fore200e_setloop(struct fore200e* fore200e, int loop_mode)
1952 u32 mct_value, mct_mask;
1955 if (!capable(CAP_NET_ADMIN))
1958 switch (loop_mode) {
1962 mct_mask = SUNI_MCT_DLE | SUNI_MCT_LLE;
1965 case ATM_LM_LOC_PHY:
1966 mct_value = mct_mask = SUNI_MCT_DLE;
1969 case ATM_LM_RMT_PHY:
1970 mct_value = mct_mask = SUNI_MCT_LLE;
1977 error = fore200e_set_oc3(fore200e, SUNI_MCT, mct_value, mct_mask);
1979 fore200e->loop_mode = loop_mode;
1986 fore200e_fetch_stats(struct fore200e* fore200e, struct sonet_stats __user *arg)
1988 struct sonet_stats tmp;
1990 if (fore200e_getstats(fore200e) < 0)
1993 tmp.section_bip = cpu_to_be32(fore200e->stats->oc3.section_bip8_errors);
1994 tmp.line_bip = cpu_to_be32(fore200e->stats->oc3.line_bip24_errors);
1995 tmp.path_bip = cpu_to_be32(fore200e->stats->oc3.path_bip8_errors);
1996 tmp.line_febe = cpu_to_be32(fore200e->stats->oc3.line_febe_errors);
1997 tmp.path_febe = cpu_to_be32(fore200e->stats->oc3.path_febe_errors);
1998 tmp.corr_hcs = cpu_to_be32(fore200e->stats->oc3.corr_hcs_errors);
1999 tmp.uncorr_hcs = cpu_to_be32(fore200e->stats->oc3.ucorr_hcs_errors);
2000 tmp.tx_cells = cpu_to_be32(fore200e->stats->aal0.cells_transmitted) +
2001 cpu_to_be32(fore200e->stats->aal34.cells_transmitted) +
2002 cpu_to_be32(fore200e->stats->aal5.cells_transmitted);
2003 tmp.rx_cells = cpu_to_be32(fore200e->stats->aal0.cells_received) +
2004 cpu_to_be32(fore200e->stats->aal34.cells_received) +
2005 cpu_to_be32(fore200e->stats->aal5.cells_received);
2008 return copy_to_user(arg, &tmp, sizeof(struct sonet_stats)) ? -EFAULT : 0;
2015 fore200e_ioctl(struct atm_dev* dev, unsigned int cmd, void __user * arg)
2017 struct fore200e* fore200e = FORE200E_DEV(dev);
2019 DPRINTK(2, "ioctl cmd = 0x%x (%u), arg = 0x%p (%lu)\n", cmd, cmd, arg, (unsigned long)arg);
2024 return fore200e_fetch_stats(fore200e, (struct sonet_stats __user *)arg);
2027 return put_user(0, (int __user *)arg) ? -EFAULT : 0;
2030 return fore200e_setloop(fore200e, (int)(unsigned long)arg);
2033 return put_user(fore200e->loop_mode, (int __user *)arg) ? -EFAULT : 0;
2036 return put_user(ATM_LM_LOC_PHY | ATM_LM_RMT_PHY, (int __user *)arg) ? -EFAULT : 0;
2039 return -ENOSYS; /* not implemented */
2044 fore200e_change_qos(struct atm_vcc* vcc,struct atm_qos* qos, int flags)
2046 struct fore200e_vcc* fore200e_vcc = FORE200E_VCC(vcc);
2047 struct fore200e* fore200e = FORE200E_DEV(vcc->dev);
2049 if (!test_bit(ATM_VF_READY, &vcc->flags)) {
2050 DPRINTK(1, "VC %d.%d.%d not ready for QoS change\n", vcc->itf, vcc->vpi, vcc->vpi);
2054 DPRINTK(2, "change_qos %d.%d.%d, "
2055 "(tx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d; "
2056 "rx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d), flags = 0x%x\n"
2057 "available_cell_rate = %u",
2058 vcc->itf, vcc->vpi, vcc->vci,
2059 fore200e_traffic_class[ qos->txtp.traffic_class ],
2060 qos->txtp.min_pcr, qos->txtp.max_pcr, qos->txtp.max_cdv, qos->txtp.max_sdu,
2061 fore200e_traffic_class[ qos->rxtp.traffic_class ],
2062 qos->rxtp.min_pcr, qos->rxtp.max_pcr, qos->rxtp.max_cdv, qos->rxtp.max_sdu,
2063 flags, fore200e->available_cell_rate);
2065 if ((qos->txtp.traffic_class == ATM_CBR) && (qos->txtp.max_pcr > 0)) {
2067 down(&fore200e->rate_sf);
2068 if (fore200e->available_cell_rate + vcc->qos.txtp.max_pcr < qos->txtp.max_pcr) {
2069 up(&fore200e->rate_sf);
2073 fore200e->available_cell_rate += vcc->qos.txtp.max_pcr;
2074 fore200e->available_cell_rate -= qos->txtp.max_pcr;
2076 up(&fore200e->rate_sf);
2078 memcpy(&vcc->qos, qos, sizeof(struct atm_qos));
2080 /* update rate control parameters */
2081 fore200e_rate_ctrl(qos, &fore200e_vcc->rate);
2083 set_bit(ATM_VF_HASQOS, &vcc->flags);
2092 static int __devinit
2093 fore200e_irq_request(struct fore200e* fore200e)
2095 if (request_irq(fore200e->irq, fore200e_interrupt, IRQF_SHARED, fore200e->name, fore200e->atm_dev) < 0) {
2097 printk(FORE200E "unable to reserve IRQ %s for device %s\n",
2098 fore200e_irq_itoa(fore200e->irq), fore200e->name);
2102 printk(FORE200E "IRQ %s reserved for device %s\n",
2103 fore200e_irq_itoa(fore200e->irq), fore200e->name);
2105 #ifdef FORE200E_USE_TASKLET
2106 tasklet_init(&fore200e->tx_tasklet, fore200e_tx_tasklet, (unsigned long)fore200e);
2107 tasklet_init(&fore200e->rx_tasklet, fore200e_rx_tasklet, (unsigned long)fore200e);
2110 fore200e->state = FORE200E_STATE_IRQ;
2115 static int __devinit
2116 fore200e_get_esi(struct fore200e* fore200e)
2118 struct prom_data* prom = kzalloc(sizeof(struct prom_data), GFP_KERNEL | GFP_DMA);
2124 ok = fore200e->bus->prom_read(fore200e, prom);
2130 printk(FORE200E "device %s, rev. %c, S/N: %d, ESI: %02x:%02x:%02x:%02x:%02x:%02x\n",
2132 (prom->hw_revision & 0xFF) + '@', /* probably meaningless with SBA boards */
2133 prom->serial_number & 0xFFFF,
2134 prom->mac_addr[ 2 ], prom->mac_addr[ 3 ], prom->mac_addr[ 4 ],
2135 prom->mac_addr[ 5 ], prom->mac_addr[ 6 ], prom->mac_addr[ 7 ]);
2137 for (i = 0; i < ESI_LEN; i++) {
2138 fore200e->esi[ i ] = fore200e->atm_dev->esi[ i ] = prom->mac_addr[ i + 2 ];
2147 static int __devinit
2148 fore200e_alloc_rx_buf(struct fore200e* fore200e)
2150 int scheme, magn, nbr, size, i;
2152 struct host_bsq* bsq;
2153 struct buffer* buffer;
2155 for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
2156 for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
2158 bsq = &fore200e->host_bsq[ scheme ][ magn ];
2160 nbr = fore200e_rx_buf_nbr[ scheme ][ magn ];
2161 size = fore200e_rx_buf_size[ scheme ][ magn ];
2163 DPRINTK(2, "rx buffers %d / %d are being allocated\n", scheme, magn);
2165 /* allocate the array of receive buffers */
2166 buffer = bsq->buffer = kzalloc(nbr * sizeof(struct buffer), GFP_KERNEL);
2171 bsq->freebuf = NULL;
2173 for (i = 0; i < nbr; i++) {
2175 buffer[ i ].scheme = scheme;
2176 buffer[ i ].magn = magn;
2177 #ifdef FORE200E_BSQ_DEBUG
2178 buffer[ i ].index = i;
2179 buffer[ i ].supplied = 0;
2182 /* allocate the receive buffer body */
2183 if (fore200e_chunk_alloc(fore200e,
2184 &buffer[ i ].data, size, fore200e->bus->buffer_alignment,
2185 DMA_FROM_DEVICE) < 0) {
2188 fore200e_chunk_free(fore200e, &buffer[ --i ].data);
2194 /* insert the buffer into the free buffer list */
2195 buffer[ i ].next = bsq->freebuf;
2196 bsq->freebuf = &buffer[ i ];
2198 /* all the buffers are free, initially */
2199 bsq->freebuf_count = nbr;
2201 #ifdef FORE200E_BSQ_DEBUG
2202 bsq_audit(3, bsq, scheme, magn);
2207 fore200e->state = FORE200E_STATE_ALLOC_BUF;
2212 static int __devinit
2213 fore200e_init_bs_queue(struct fore200e* fore200e)
2215 int scheme, magn, i;
2217 struct host_bsq* bsq;
2218 struct cp_bsq_entry __iomem * cp_entry;
2220 for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++) {
2221 for (magn = 0; magn < BUFFER_MAGN_NBR; magn++) {
2223 DPRINTK(2, "buffer supply queue %d / %d is being initialized\n", scheme, magn);
2225 bsq = &fore200e->host_bsq[ scheme ][ magn ];
2227 /* allocate and align the array of status words */
2228 if (fore200e->bus->dma_chunk_alloc(fore200e,
2230 sizeof(enum status),
2232 fore200e->bus->status_alignment) < 0) {
2236 /* allocate and align the array of receive buffer descriptors */
2237 if (fore200e->bus->dma_chunk_alloc(fore200e,
2239 sizeof(struct rbd_block),
2241 fore200e->bus->descr_alignment) < 0) {
2243 fore200e->bus->dma_chunk_free(fore200e, &bsq->status);
2247 /* get the base address of the cp resident buffer supply queue entries */
2248 cp_entry = fore200e->virt_base +
2249 fore200e->bus->read(&fore200e->cp_queues->cp_bsq[ scheme ][ magn ]);
2251 /* fill the host resident and cp resident buffer supply queue entries */
2252 for (i = 0; i < QUEUE_SIZE_BS; i++) {
2254 bsq->host_entry[ i ].status =
2255 FORE200E_INDEX(bsq->status.align_addr, enum status, i);
2256 bsq->host_entry[ i ].rbd_block =
2257 FORE200E_INDEX(bsq->rbd_block.align_addr, struct rbd_block, i);
2258 bsq->host_entry[ i ].rbd_block_dma =
2259 FORE200E_DMA_INDEX(bsq->rbd_block.dma_addr, struct rbd_block, i);
2260 bsq->host_entry[ i ].cp_entry = &cp_entry[ i ];
2262 *bsq->host_entry[ i ].status = STATUS_FREE;
2264 fore200e->bus->write(FORE200E_DMA_INDEX(bsq->status.dma_addr, enum status, i),
2265 &cp_entry[ i ].status_haddr);
2270 fore200e->state = FORE200E_STATE_INIT_BSQ;
2275 static int __devinit
2276 fore200e_init_rx_queue(struct fore200e* fore200e)
2278 struct host_rxq* rxq = &fore200e->host_rxq;
2279 struct cp_rxq_entry __iomem * cp_entry;
2282 DPRINTK(2, "receive queue is being initialized\n");
2284 /* allocate and align the array of status words */
2285 if (fore200e->bus->dma_chunk_alloc(fore200e,
2287 sizeof(enum status),
2289 fore200e->bus->status_alignment) < 0) {
2293 /* allocate and align the array of receive PDU descriptors */
2294 if (fore200e->bus->dma_chunk_alloc(fore200e,
2298 fore200e->bus->descr_alignment) < 0) {
2300 fore200e->bus->dma_chunk_free(fore200e, &rxq->status);
2304 /* get the base address of the cp resident rx queue entries */
2305 cp_entry = fore200e->virt_base + fore200e->bus->read(&fore200e->cp_queues->cp_rxq);
2307 /* fill the host resident and cp resident rx entries */
2308 for (i=0; i < QUEUE_SIZE_RX; i++) {
2310 rxq->host_entry[ i ].status =
2311 FORE200E_INDEX(rxq->status.align_addr, enum status, i);
2312 rxq->host_entry[ i ].rpd =
2313 FORE200E_INDEX(rxq->rpd.align_addr, struct rpd, i);
2314 rxq->host_entry[ i ].rpd_dma =
2315 FORE200E_DMA_INDEX(rxq->rpd.dma_addr, struct rpd, i);
2316 rxq->host_entry[ i ].cp_entry = &cp_entry[ i ];
2318 *rxq->host_entry[ i ].status = STATUS_FREE;
2320 fore200e->bus->write(FORE200E_DMA_INDEX(rxq->status.dma_addr, enum status, i),
2321 &cp_entry[ i ].status_haddr);
2323 fore200e->bus->write(FORE200E_DMA_INDEX(rxq->rpd.dma_addr, struct rpd, i),
2324 &cp_entry[ i ].rpd_haddr);
2327 /* set the head entry of the queue */
2330 fore200e->state = FORE200E_STATE_INIT_RXQ;
2335 static int __devinit
2336 fore200e_init_tx_queue(struct fore200e* fore200e)
2338 struct host_txq* txq = &fore200e->host_txq;
2339 struct cp_txq_entry __iomem * cp_entry;
2342 DPRINTK(2, "transmit queue is being initialized\n");
2344 /* allocate and align the array of status words */
2345 if (fore200e->bus->dma_chunk_alloc(fore200e,
2347 sizeof(enum status),
2349 fore200e->bus->status_alignment) < 0) {
2353 /* allocate and align the array of transmit PDU descriptors */
2354 if (fore200e->bus->dma_chunk_alloc(fore200e,
2358 fore200e->bus->descr_alignment) < 0) {
2360 fore200e->bus->dma_chunk_free(fore200e, &txq->status);
2364 /* get the base address of the cp resident tx queue entries */
2365 cp_entry = fore200e->virt_base + fore200e->bus->read(&fore200e->cp_queues->cp_txq);
2367 /* fill the host resident and cp resident tx entries */
2368 for (i=0; i < QUEUE_SIZE_TX; i++) {
2370 txq->host_entry[ i ].status =
2371 FORE200E_INDEX(txq->status.align_addr, enum status, i);
2372 txq->host_entry[ i ].tpd =
2373 FORE200E_INDEX(txq->tpd.align_addr, struct tpd, i);
2374 txq->host_entry[ i ].tpd_dma =
2375 FORE200E_DMA_INDEX(txq->tpd.dma_addr, struct tpd, i);
2376 txq->host_entry[ i ].cp_entry = &cp_entry[ i ];
2378 *txq->host_entry[ i ].status = STATUS_FREE;
2380 fore200e->bus->write(FORE200E_DMA_INDEX(txq->status.dma_addr, enum status, i),
2381 &cp_entry[ i ].status_haddr);
2383 /* although there is a one-to-one mapping of tx queue entries and tpds,
2384 we do not write here the DMA (physical) base address of each tpd into
2385 the related cp resident entry, because the cp relies on this write
2386 operation to detect that a new pdu has been submitted for tx */
2389 /* set the head and tail entries of the queue */
2393 fore200e->state = FORE200E_STATE_INIT_TXQ;
2398 static int __devinit
2399 fore200e_init_cmd_queue(struct fore200e* fore200e)
2401 struct host_cmdq* cmdq = &fore200e->host_cmdq;
2402 struct cp_cmdq_entry __iomem * cp_entry;
2405 DPRINTK(2, "command queue is being initialized\n");
2407 /* allocate and align the array of status words */
2408 if (fore200e->bus->dma_chunk_alloc(fore200e,
2410 sizeof(enum status),
2412 fore200e->bus->status_alignment) < 0) {
2416 /* get the base address of the cp resident cmd queue entries */
2417 cp_entry = fore200e->virt_base + fore200e->bus->read(&fore200e->cp_queues->cp_cmdq);
2419 /* fill the host resident and cp resident cmd entries */
2420 for (i=0; i < QUEUE_SIZE_CMD; i++) {
2422 cmdq->host_entry[ i ].status =
2423 FORE200E_INDEX(cmdq->status.align_addr, enum status, i);
2424 cmdq->host_entry[ i ].cp_entry = &cp_entry[ i ];
2426 *cmdq->host_entry[ i ].status = STATUS_FREE;
2428 fore200e->bus->write(FORE200E_DMA_INDEX(cmdq->status.dma_addr, enum status, i),
2429 &cp_entry[ i ].status_haddr);
2432 /* set the head entry of the queue */
2435 fore200e->state = FORE200E_STATE_INIT_CMDQ;
2441 fore200e_param_bs_queue(struct fore200e* fore200e,
2442 enum buffer_scheme scheme, enum buffer_magn magn,
2443 int queue_length, int pool_size, int supply_blksize)
2445 struct bs_spec __iomem * bs_spec = &fore200e->cp_queues->init.bs_spec[ scheme ][ magn ];
2447 fore200e->bus->write(queue_length, &bs_spec->queue_length);
2448 fore200e->bus->write(fore200e_rx_buf_size[ scheme ][ magn ], &bs_spec->buffer_size);
2449 fore200e->bus->write(pool_size, &bs_spec->pool_size);
2450 fore200e->bus->write(supply_blksize, &bs_spec->supply_blksize);
2454 static int __devinit
2455 fore200e_initialize(struct fore200e* fore200e)
2457 struct cp_queues __iomem * cpq;
2458 int ok, scheme, magn;
2460 DPRINTK(2, "device %s being initialized\n", fore200e->name);
2462 init_MUTEX(&fore200e->rate_sf);
2463 spin_lock_init(&fore200e->q_lock);
2465 cpq = fore200e->cp_queues = fore200e->virt_base + FORE200E_CP_QUEUES_OFFSET;
2467 /* enable cp to host interrupts */
2468 fore200e->bus->write(1, &cpq->imask);
2470 if (fore200e->bus->irq_enable)
2471 fore200e->bus->irq_enable(fore200e);
2473 fore200e->bus->write(NBR_CONNECT, &cpq->init.num_connect);
2475 fore200e->bus->write(QUEUE_SIZE_CMD, &cpq->init.cmd_queue_len);
2476 fore200e->bus->write(QUEUE_SIZE_RX, &cpq->init.rx_queue_len);
2477 fore200e->bus->write(QUEUE_SIZE_TX, &cpq->init.tx_queue_len);
2479 fore200e->bus->write(RSD_EXTENSION, &cpq->init.rsd_extension);
2480 fore200e->bus->write(TSD_EXTENSION, &cpq->init.tsd_extension);
2482 for (scheme = 0; scheme < BUFFER_SCHEME_NBR; scheme++)
2483 for (magn = 0; magn < BUFFER_MAGN_NBR; magn++)
2484 fore200e_param_bs_queue(fore200e, scheme, magn,
2486 fore200e_rx_buf_nbr[ scheme ][ magn ],
2489 /* issue the initialize command */
2490 fore200e->bus->write(STATUS_PENDING, &cpq->init.status);
2491 fore200e->bus->write(OPCODE_INITIALIZE, &cpq->init.opcode);
2493 ok = fore200e_io_poll(fore200e, &cpq->init.status, STATUS_COMPLETE, 3000);
2495 printk(FORE200E "device %s initialization failed\n", fore200e->name);
2499 printk(FORE200E "device %s initialized\n", fore200e->name);
2501 fore200e->state = FORE200E_STATE_INITIALIZE;
2506 static void __devinit
2507 fore200e_monitor_putc(struct fore200e* fore200e, char c)
2509 struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
2514 fore200e->bus->write(((u32) c) | FORE200E_CP_MONITOR_UART_AVAIL, &monitor->soft_uart.send);
2518 static int __devinit
2519 fore200e_monitor_getc(struct fore200e* fore200e)
2521 struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
2522 unsigned long timeout = jiffies + msecs_to_jiffies(50);
2525 while (time_before(jiffies, timeout)) {
2527 c = (int) fore200e->bus->read(&monitor->soft_uart.recv);
2529 if (c & FORE200E_CP_MONITOR_UART_AVAIL) {
2531 fore200e->bus->write(FORE200E_CP_MONITOR_UART_FREE, &monitor->soft_uart.recv);
2533 printk("%c", c & 0xFF);
2543 static void __devinit
2544 fore200e_monitor_puts(struct fore200e* fore200e, char* str)
2548 /* the i960 monitor doesn't accept any new character if it has something to say */
2549 while (fore200e_monitor_getc(fore200e) >= 0);
2551 fore200e_monitor_putc(fore200e, *str++);
2554 while (fore200e_monitor_getc(fore200e) >= 0);
2558 static int __devinit
2559 fore200e_start_fw(struct fore200e* fore200e)
2563 struct fw_header* fw_header = (struct fw_header*) fore200e->bus->fw_data;
2565 DPRINTK(2, "device %s firmware being started\n", fore200e->name);
2567 #if defined(__sparc_v9__)
2568 /* reported to be required by SBA cards on some sparc64 hosts */
2572 sprintf(cmd, "\rgo %x\r", le32_to_cpu(fw_header->start_offset));
2574 fore200e_monitor_puts(fore200e, cmd);
2576 ok = fore200e_io_poll(fore200e, &fore200e->cp_monitor->bstat, BSTAT_CP_RUNNING, 1000);
2578 printk(FORE200E "device %s firmware didn't start\n", fore200e->name);
2582 printk(FORE200E "device %s firmware started\n", fore200e->name);
2584 fore200e->state = FORE200E_STATE_START_FW;
2589 static int __devinit
2590 fore200e_load_fw(struct fore200e* fore200e)
2592 u32* fw_data = (u32*) fore200e->bus->fw_data;
2593 u32 fw_size = (u32) *fore200e->bus->fw_size / sizeof(u32);
2595 struct fw_header* fw_header = (struct fw_header*) fw_data;
2597 u32 __iomem *load_addr = fore200e->virt_base + le32_to_cpu(fw_header->load_offset);
2599 DPRINTK(2, "device %s firmware being loaded at 0x%p (%d words)\n",
2600 fore200e->name, load_addr, fw_size);
2602 if (le32_to_cpu(fw_header->magic) != FW_HEADER_MAGIC) {
2603 printk(FORE200E "corrupted %s firmware image\n", fore200e->bus->model_name);
2607 for (; fw_size--; fw_data++, load_addr++)
2608 fore200e->bus->write(le32_to_cpu(*fw_data), load_addr);
2610 fore200e->state = FORE200E_STATE_LOAD_FW;
2615 static int __devinit
2616 fore200e_register(struct fore200e* fore200e)
2618 struct atm_dev* atm_dev;
2620 DPRINTK(2, "device %s being registered\n", fore200e->name);
2622 atm_dev = atm_dev_register(fore200e->bus->proc_name, &fore200e_ops, -1,
2624 if (atm_dev == NULL) {
2625 printk(FORE200E "unable to register device %s\n", fore200e->name);
2629 atm_dev->dev_data = fore200e;
2630 fore200e->atm_dev = atm_dev;
2632 atm_dev->ci_range.vpi_bits = FORE200E_VPI_BITS;
2633 atm_dev->ci_range.vci_bits = FORE200E_VCI_BITS;
2635 fore200e->available_cell_rate = ATM_OC3_PCR;
2637 fore200e->state = FORE200E_STATE_REGISTER;
2642 static int __devinit
2643 fore200e_init(struct fore200e* fore200e)
2645 if (fore200e_register(fore200e) < 0)
2648 if (fore200e->bus->configure(fore200e) < 0)
2651 if (fore200e->bus->map(fore200e) < 0)
2654 if (fore200e_reset(fore200e, 1) < 0)
2657 if (fore200e_load_fw(fore200e) < 0)
2660 if (fore200e_start_fw(fore200e) < 0)
2663 if (fore200e_initialize(fore200e) < 0)
2666 if (fore200e_init_cmd_queue(fore200e) < 0)
2669 if (fore200e_init_tx_queue(fore200e) < 0)
2672 if (fore200e_init_rx_queue(fore200e) < 0)
2675 if (fore200e_init_bs_queue(fore200e) < 0)
2678 if (fore200e_alloc_rx_buf(fore200e) < 0)
2681 if (fore200e_get_esi(fore200e) < 0)
2684 if (fore200e_irq_request(fore200e) < 0)
2687 fore200e_supply(fore200e);
2689 /* all done, board initialization is now complete */
2690 fore200e->state = FORE200E_STATE_COMPLETE;
2695 static int __devinit
2696 fore200e_pca_detect(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
2698 const struct fore200e_bus* bus = (struct fore200e_bus*) pci_ent->driver_data;
2699 struct fore200e* fore200e;
2701 static int index = 0;
2703 if (pci_enable_device(pci_dev)) {
2708 fore200e = kzalloc(sizeof(struct fore200e), GFP_KERNEL);
2709 if (fore200e == NULL) {
2714 fore200e->bus = bus;
2715 fore200e->bus_dev = pci_dev;
2716 fore200e->irq = pci_dev->irq;
2717 fore200e->phys_base = pci_resource_start(pci_dev, 0);
2719 sprintf(fore200e->name, "%s-%d", bus->model_name, index - 1);
2721 pci_set_master(pci_dev);
2723 printk(FORE200E "device %s found at 0x%lx, IRQ %s\n",
2724 fore200e->bus->model_name,
2725 fore200e->phys_base, fore200e_irq_itoa(fore200e->irq));
2727 sprintf(fore200e->name, "%s-%d", bus->model_name, index);
2729 err = fore200e_init(fore200e);
2731 fore200e_shutdown(fore200e);
2736 pci_set_drvdata(pci_dev, fore200e);
2744 pci_disable_device(pci_dev);
2749 static void __devexit fore200e_pca_remove_one(struct pci_dev *pci_dev)
2751 struct fore200e *fore200e;
2753 fore200e = pci_get_drvdata(pci_dev);
2755 fore200e_shutdown(fore200e);
2757 pci_disable_device(pci_dev);
2761 #ifdef CONFIG_ATM_FORE200E_PCA
2762 static struct pci_device_id fore200e_pca_tbl[] = {
2763 { PCI_VENDOR_ID_FORE, PCI_DEVICE_ID_FORE_PCA200E, PCI_ANY_ID, PCI_ANY_ID,
2764 0, 0, (unsigned long) &fore200e_bus[0] },
2768 MODULE_DEVICE_TABLE(pci, fore200e_pca_tbl);
2770 static struct pci_driver fore200e_pca_driver = {
2771 .name = "fore_200e",
2772 .probe = fore200e_pca_detect,
2773 .remove = __devexit_p(fore200e_pca_remove_one),
2774 .id_table = fore200e_pca_tbl,
2780 fore200e_module_init(void)
2782 const struct fore200e_bus* bus;
2783 struct fore200e* fore200e;
2786 printk(FORE200E "FORE Systems 200E-series ATM driver - version " FORE200E_VERSION "\n");
2788 /* for each configured bus interface */
2789 for (bus = fore200e_bus; bus->model_name; bus++) {
2791 /* detect all boards present on that bus */
2792 for (index = 0; bus->detect && (fore200e = bus->detect(bus, index)); index++) {
2794 printk(FORE200E "device %s found at 0x%lx, IRQ %s\n",
2795 fore200e->bus->model_name,
2796 fore200e->phys_base, fore200e_irq_itoa(fore200e->irq));
2798 sprintf(fore200e->name, "%s-%d", bus->model_name, index);
2800 if (fore200e_init(fore200e) < 0) {
2802 fore200e_shutdown(fore200e);
2806 list_add(&fore200e->entry, &fore200e_boards);
2810 #ifdef CONFIG_ATM_FORE200E_PCA
2811 if (!pci_register_driver(&fore200e_pca_driver))
2815 if (!list_empty(&fore200e_boards))
2823 fore200e_module_cleanup(void)
2825 struct fore200e *fore200e, *next;
2827 #ifdef CONFIG_ATM_FORE200E_PCA
2828 pci_unregister_driver(&fore200e_pca_driver);
2831 list_for_each_entry_safe(fore200e, next, &fore200e_boards, entry) {
2832 fore200e_shutdown(fore200e);
2835 DPRINTK(1, "module being removed\n");
2840 fore200e_proc_read(struct atm_dev *dev, loff_t* pos, char* page)
2842 struct fore200e* fore200e = FORE200E_DEV(dev);
2843 struct fore200e_vcc* fore200e_vcc;
2844 struct atm_vcc* vcc;
2845 int i, len, left = *pos;
2846 unsigned long flags;
2850 if (fore200e_getstats(fore200e) < 0)
2853 len = sprintf(page,"\n"
2855 " internal name:\t\t%s\n", fore200e->name);
2857 /* print bus-specific information */
2858 if (fore200e->bus->proc_read)
2859 len += fore200e->bus->proc_read(fore200e, page + len);
2861 len += sprintf(page + len,
2862 " interrupt line:\t\t%s\n"
2863 " physical base address:\t0x%p\n"
2864 " virtual base address:\t0x%p\n"
2865 " factory address (ESI):\t%02x:%02x:%02x:%02x:%02x:%02x\n"
2866 " board serial number:\t\t%d\n\n",
2867 fore200e_irq_itoa(fore200e->irq),
2868 (void*)fore200e->phys_base,
2869 fore200e->virt_base,
2870 fore200e->esi[0], fore200e->esi[1], fore200e->esi[2],
2871 fore200e->esi[3], fore200e->esi[4], fore200e->esi[5],
2872 fore200e->esi[4] * 256 + fore200e->esi[5]);
2878 return sprintf(page,
2879 " free small bufs, scheme 1:\t%d\n"
2880 " free large bufs, scheme 1:\t%d\n"
2881 " free small bufs, scheme 2:\t%d\n"
2882 " free large bufs, scheme 2:\t%d\n",
2883 fore200e->host_bsq[ BUFFER_SCHEME_ONE ][ BUFFER_MAGN_SMALL ].freebuf_count,
2884 fore200e->host_bsq[ BUFFER_SCHEME_ONE ][ BUFFER_MAGN_LARGE ].freebuf_count,
2885 fore200e->host_bsq[ BUFFER_SCHEME_TWO ][ BUFFER_MAGN_SMALL ].freebuf_count,
2886 fore200e->host_bsq[ BUFFER_SCHEME_TWO ][ BUFFER_MAGN_LARGE ].freebuf_count);
2889 u32 hb = fore200e->bus->read(&fore200e->cp_queues->heartbeat);
2891 len = sprintf(page,"\n\n"
2892 " cell processor:\n"
2893 " heartbeat state:\t\t");
2895 if (hb >> 16 != 0xDEAD)
2896 len += sprintf(page + len, "0x%08x\n", hb);
2898 len += sprintf(page + len, "*** FATAL ERROR %04x ***\n", hb & 0xFFFF);
2904 static const char* media_name[] = {
2905 "unshielded twisted pair",
2906 "multimode optical fiber ST",
2907 "multimode optical fiber SC",
2908 "single-mode optical fiber ST",
2909 "single-mode optical fiber SC",
2913 static const char* oc3_mode[] = {
2915 "diagnostic loopback",
2920 u32 fw_release = fore200e->bus->read(&fore200e->cp_queues->fw_release);
2921 u32 mon960_release = fore200e->bus->read(&fore200e->cp_queues->mon960_release);
2922 u32 oc3_revision = fore200e->bus->read(&fore200e->cp_queues->oc3_revision);
2923 u32 media_index = FORE200E_MEDIA_INDEX(fore200e->bus->read(&fore200e->cp_queues->media_type));
2926 if ((media_index < 0) || (media_index > 4))
2929 switch (fore200e->loop_mode) {
2930 case ATM_LM_NONE: oc3_index = 0;
2932 case ATM_LM_LOC_PHY: oc3_index = 1;
2934 case ATM_LM_RMT_PHY: oc3_index = 2;
2936 default: oc3_index = 3;
2939 return sprintf(page,
2940 " firmware release:\t\t%d.%d.%d\n"
2941 " monitor release:\t\t%d.%d\n"
2942 " media type:\t\t\t%s\n"
2943 " OC-3 revision:\t\t0x%x\n"
2944 " OC-3 mode:\t\t\t%s",
2945 fw_release >> 16, fw_release << 16 >> 24, fw_release << 24 >> 24,
2946 mon960_release >> 16, mon960_release << 16 >> 16,
2947 media_name[ media_index ],
2949 oc3_mode[ oc3_index ]);
2953 struct cp_monitor __iomem * cp_monitor = fore200e->cp_monitor;
2955 return sprintf(page,
2958 " version number:\t\t%d\n"
2959 " boot status word:\t\t0x%08x\n",
2960 fore200e->bus->read(&cp_monitor->mon_version),
2961 fore200e->bus->read(&cp_monitor->bstat));
2965 return sprintf(page,
2967 " device statistics:\n"
2969 " crc_header_errors:\t\t%10u\n"
2970 " framing_errors:\t\t%10u\n",
2971 cpu_to_be32(fore200e->stats->phy.crc_header_errors),
2972 cpu_to_be32(fore200e->stats->phy.framing_errors));
2975 return sprintf(page, "\n"
2977 " section_bip8_errors:\t%10u\n"
2978 " path_bip8_errors:\t\t%10u\n"
2979 " line_bip24_errors:\t\t%10u\n"
2980 " line_febe_errors:\t\t%10u\n"
2981 " path_febe_errors:\t\t%10u\n"
2982 " corr_hcs_errors:\t\t%10u\n"
2983 " ucorr_hcs_errors:\t\t%10u\n",
2984 cpu_to_be32(fore200e->stats->oc3.section_bip8_errors),
2985 cpu_to_be32(fore200e->stats->oc3.path_bip8_errors),
2986 cpu_to_be32(fore200e->stats->oc3.line_bip24_errors),
2987 cpu_to_be32(fore200e->stats->oc3.line_febe_errors),
2988 cpu_to_be32(fore200e->stats->oc3.path_febe_errors),
2989 cpu_to_be32(fore200e->stats->oc3.corr_hcs_errors),
2990 cpu_to_be32(fore200e->stats->oc3.ucorr_hcs_errors));
2993 return sprintf(page,"\n"
2994 " ATM:\t\t\t\t cells\n"
2997 " vpi out of range:\t\t%10u\n"
2998 " vpi no conn:\t\t%10u\n"
2999 " vci out of range:\t\t%10u\n"
3000 " vci no conn:\t\t%10u\n",
3001 cpu_to_be32(fore200e->stats->atm.cells_transmitted),
3002 cpu_to_be32(fore200e->stats->atm.cells_received),
3003 cpu_to_be32(fore200e->stats->atm.vpi_bad_range),
3004 cpu_to_be32(fore200e->stats->atm.vpi_no_conn),
3005 cpu_to_be32(fore200e->stats->atm.vci_bad_range),
3006 cpu_to_be32(fore200e->stats->atm.vci_no_conn));
3009 return sprintf(page,"\n"
3010 " AAL0:\t\t\t cells\n"
3013 " dropped:\t\t\t%10u\n",
3014 cpu_to_be32(fore200e->stats->aal0.cells_transmitted),
3015 cpu_to_be32(fore200e->stats->aal0.cells_received),
3016 cpu_to_be32(fore200e->stats->aal0.cells_dropped));
3019 return sprintf(page,"\n"
3021 " SAR sublayer:\t\t cells\n"
3024 " dropped:\t\t\t%10u\n"
3025 " CRC errors:\t\t%10u\n"
3026 " protocol errors:\t\t%10u\n\n"
3027 " CS sublayer:\t\t PDUs\n"
3030 " dropped:\t\t\t%10u\n"
3031 " protocol errors:\t\t%10u\n",
3032 cpu_to_be32(fore200e->stats->aal34.cells_transmitted),
3033 cpu_to_be32(fore200e->stats->aal34.cells_received),
3034 cpu_to_be32(fore200e->stats->aal34.cells_dropped),
3035 cpu_to_be32(fore200e->stats->aal34.cells_crc_errors),
3036 cpu_to_be32(fore200e->stats->aal34.cells_protocol_errors),
3037 cpu_to_be32(fore200e->stats->aal34.cspdus_transmitted),
3038 cpu_to_be32(fore200e->stats->aal34.cspdus_received),
3039 cpu_to_be32(fore200e->stats->aal34.cspdus_dropped),
3040 cpu_to_be32(fore200e->stats->aal34.cspdus_protocol_errors));
3043 return sprintf(page,"\n"
3045 " SAR sublayer:\t\t cells\n"
3048 " dropped:\t\t\t%10u\n"
3049 " congestions:\t\t%10u\n\n"
3050 " CS sublayer:\t\t PDUs\n"
3053 " dropped:\t\t\t%10u\n"
3054 " CRC errors:\t\t%10u\n"
3055 " protocol errors:\t\t%10u\n",
3056 cpu_to_be32(fore200e->stats->aal5.cells_transmitted),
3057 cpu_to_be32(fore200e->stats->aal5.cells_received),
3058 cpu_to_be32(fore200e->stats->aal5.cells_dropped),
3059 cpu_to_be32(fore200e->stats->aal5.congestion_experienced),
3060 cpu_to_be32(fore200e->stats->aal5.cspdus_transmitted),
3061 cpu_to_be32(fore200e->stats->aal5.cspdus_received),
3062 cpu_to_be32(fore200e->stats->aal5.cspdus_dropped),
3063 cpu_to_be32(fore200e->stats->aal5.cspdus_crc_errors),
3064 cpu_to_be32(fore200e->stats->aal5.cspdus_protocol_errors));
3067 return sprintf(page,"\n"
3068 " AUX:\t\t allocation failures\n"
3069 " small b1:\t\t\t%10u\n"
3070 " large b1:\t\t\t%10u\n"
3071 " small b2:\t\t\t%10u\n"
3072 " large b2:\t\t\t%10u\n"
3073 " RX PDUs:\t\t\t%10u\n"
3074 " TX PDUs:\t\t\t%10lu\n",
3075 cpu_to_be32(fore200e->stats->aux.small_b1_failed),
3076 cpu_to_be32(fore200e->stats->aux.large_b1_failed),
3077 cpu_to_be32(fore200e->stats->aux.small_b2_failed),
3078 cpu_to_be32(fore200e->stats->aux.large_b2_failed),
3079 cpu_to_be32(fore200e->stats->aux.rpd_alloc_failed),
3083 return sprintf(page,"\n"
3084 " receive carrier:\t\t\t%s\n",
3085 fore200e->stats->aux.receive_carrier ? "ON" : "OFF!");
3088 return sprintf(page,"\n"
3089 " VCCs:\n address VPI VCI AAL "
3090 "TX PDUs TX min/max size RX PDUs RX min/max size\n");
3093 for (i = 0; i < NBR_CONNECT; i++) {
3095 vcc = fore200e->vc_map[i].vcc;
3100 spin_lock_irqsave(&fore200e->q_lock, flags);
3102 if (vcc && test_bit(ATM_VF_READY, &vcc->flags) && !left--) {
3104 fore200e_vcc = FORE200E_VCC(vcc);
3105 ASSERT(fore200e_vcc);
3108 " %08x %03d %05d %1d %09lu %05d/%05d %09lu %05d/%05d\n",
3109 (u32)(unsigned long)vcc,
3110 vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal),
3111 fore200e_vcc->tx_pdu,
3112 fore200e_vcc->tx_min_pdu > 0xFFFF ? 0 : fore200e_vcc->tx_min_pdu,
3113 fore200e_vcc->tx_max_pdu,
3114 fore200e_vcc->rx_pdu,
3115 fore200e_vcc->rx_min_pdu > 0xFFFF ? 0 : fore200e_vcc->rx_min_pdu,
3116 fore200e_vcc->rx_max_pdu);
3118 spin_unlock_irqrestore(&fore200e->q_lock, flags);
3122 spin_unlock_irqrestore(&fore200e->q_lock, flags);
3128 module_init(fore200e_module_init);
3129 module_exit(fore200e_module_cleanup);
3132 static const struct atmdev_ops fore200e_ops =
3134 .open = fore200e_open,
3135 .close = fore200e_close,
3136 .ioctl = fore200e_ioctl,
3137 .getsockopt = fore200e_getsockopt,
3138 .setsockopt = fore200e_setsockopt,
3139 .send = fore200e_send,
3140 .change_qos = fore200e_change_qos,
3141 .proc_read = fore200e_proc_read,
3142 .owner = THIS_MODULE
3146 #ifdef CONFIG_ATM_FORE200E_PCA
3147 extern const unsigned char _fore200e_pca_fw_data[];
3148 extern const unsigned int _fore200e_pca_fw_size;
3150 #ifdef CONFIG_ATM_FORE200E_SBA
3151 extern const unsigned char _fore200e_sba_fw_data[];
3152 extern const unsigned int _fore200e_sba_fw_size;
3155 static const struct fore200e_bus fore200e_bus[] = {
3156 #ifdef CONFIG_ATM_FORE200E_PCA
3157 { "PCA-200E", "pca200e", 32, 4, 32,
3158 _fore200e_pca_fw_data, &_fore200e_pca_fw_size,
3161 fore200e_pca_dma_map,
3162 fore200e_pca_dma_unmap,
3163 fore200e_pca_dma_sync_for_cpu,
3164 fore200e_pca_dma_sync_for_device,
3165 fore200e_pca_dma_chunk_alloc,
3166 fore200e_pca_dma_chunk_free,
3168 fore200e_pca_configure,
3171 fore200e_pca_prom_read,
3174 fore200e_pca_irq_check,
3175 fore200e_pca_irq_ack,
3176 fore200e_pca_proc_read,
3179 #ifdef CONFIG_ATM_FORE200E_SBA
3180 { "SBA-200E", "sba200e", 32, 64, 32,
3181 _fore200e_sba_fw_data, &_fore200e_sba_fw_size,
3184 fore200e_sba_dma_map,
3185 fore200e_sba_dma_unmap,
3186 fore200e_sba_dma_sync_for_cpu,
3187 fore200e_sba_dma_sync_for_device,
3188 fore200e_sba_dma_chunk_alloc,
3189 fore200e_sba_dma_chunk_free,
3190 fore200e_sba_detect,
3191 fore200e_sba_configure,
3194 fore200e_sba_prom_read,
3196 fore200e_sba_irq_enable,
3197 fore200e_sba_irq_check,
3198 fore200e_sba_irq_ack,
3199 fore200e_sba_proc_read,
3205 #ifdef MODULE_LICENSE
3206 MODULE_LICENSE("GPL");