Lines Matching +full:twisted +full:- +full:pair

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 A FORE Systems 200E-series driver for ATM on Linux.
4 Christophe Lizzi (lizzi@cnam.fr), October 1999-March 2003.
6 Based on the PCA-200E driver from Uwe Dannowski (Uwe.Dannowski@inf.tu-dresden.de).
8 This driver simultaneously supports PCA-200E and SBA-200E adapters
24 #include <linux/dma-mapping.h>
53 #if 1 /* ensure correct handling of 52-byte AAL0 SDUs expected by atmdump-like apps */
76 ((((unsigned long)(addr) + (alignment - 1)) & ~(alignment - 1)) - (unsigned long)(addr))
97 MODULE_AUTHOR("Christophe Lizzi - credits to Uwe Dannowski and Heikki Vatiainen");
98 MODULE_DESCRIPTION("FORE Systems 200E-series ATM driver - version " FORE200E_VERSION);
126 return -EINVAL;
142 return -EINVAL; in fore200e_atm2fore_aal()
166 chunk->alloc_size = size + alignment; in fore200e_chunk_alloc()
167 chunk->direction = direction; in fore200e_chunk_alloc()
169 chunk->alloc_addr = kzalloc(chunk->alloc_size, GFP_KERNEL); in fore200e_chunk_alloc()
170 if (chunk->alloc_addr == NULL) in fore200e_chunk_alloc()
171 return -ENOMEM; in fore200e_chunk_alloc()
174 offset = FORE200E_ALIGN(chunk->alloc_addr, alignment); in fore200e_chunk_alloc()
176 chunk->align_addr = chunk->alloc_addr + offset; in fore200e_chunk_alloc()
178 chunk->dma_addr = dma_map_single(fore200e->dev, chunk->align_addr, in fore200e_chunk_alloc()
180 if (dma_mapping_error(fore200e->dev, chunk->dma_addr)) { in fore200e_chunk_alloc()
181 kfree(chunk->alloc_addr); in fore200e_chunk_alloc()
182 return -ENOMEM; in fore200e_chunk_alloc()
193 dma_unmap_single(fore200e->dev, chunk->dma_addr, chunk->dma_size, in fore200e_chunk_free()
194 chunk->direction); in fore200e_chunk_free()
195 kfree(chunk->alloc_addr); in fore200e_chunk_free()
207 /* returned chunks are page-aligned */ in fore200e_dma_chunk_alloc()
208 chunk->alloc_size = size * nbr; in fore200e_dma_chunk_alloc()
209 chunk->alloc_addr = dma_alloc_coherent(fore200e->dev, chunk->alloc_size, in fore200e_dma_chunk_alloc()
210 &chunk->dma_addr, GFP_KERNEL); in fore200e_dma_chunk_alloc()
211 if (!chunk->alloc_addr) in fore200e_dma_chunk_alloc()
212 return -ENOMEM; in fore200e_dma_chunk_alloc()
213 chunk->align_addr = chunk->alloc_addr; in fore200e_dma_chunk_alloc()
223 dma_free_coherent(fore200e->dev, chunk->alloc_size, chunk->alloc_addr, in fore200e_dma_chunk_free()
224 chunk->dma_addr); in fore200e_dma_chunk_free()
266 if ((ok = (fore200e->bus->read(addr) == val))) in fore200e_io_poll()
274 fore200e->bus->read(addr), val); in fore200e_io_poll()
291 if ((buffer = fore200e->host_bsq[ scheme ][ magn ].buffer) != NULL) { in fore200e_free_rx_buf()
297 if (data->alloc_addr != NULL) in fore200e_free_rx_buf()
314 struct chunk* status = &fore200e->host_bsq[ scheme ][ magn ].status; in fore200e_uninit_bs_queue()
315 struct chunk* rbd_block = &fore200e->host_bsq[ scheme ][ magn ].rbd_block; in fore200e_uninit_bs_queue()
317 if (status->alloc_addr) in fore200e_uninit_bs_queue()
320 if (rbd_block->alloc_addr) in fore200e_uninit_bs_queue()
332 fore200e->cp_monitor = fore200e->virt_base + FORE200E_CP_MONITOR_OFFSET; in fore200e_reset()
334 fore200e->bus->write(BSTAT_COLD_START, &fore200e->cp_monitor->bstat); in fore200e_reset()
336 fore200e->bus->reset(fore200e); in fore200e_reset()
339 ok = fore200e_io_poll(fore200e, &fore200e->cp_monitor->bstat, BSTAT_SELFTEST_OK, 1000); in fore200e_reset()
342 printk(FORE200E "device %s self-test failed\n", fore200e->name); in fore200e_reset()
343 return -ENODEV; in fore200e_reset()
346 printk(FORE200E "device %s self-test passed\n", fore200e->name); in fore200e_reset()
348 fore200e->state = FORE200E_STATE_RESET; in fore200e_reset()
359 fore200e->name, fore200e->phys_base, in fore200e_shutdown()
360 fore200e_irq_itoa(fore200e->irq)); in fore200e_shutdown()
362 if (fore200e->state > FORE200E_STATE_RESET) { in fore200e_shutdown()
368 switch(fore200e->state) { in fore200e_shutdown()
371 kfree(fore200e->stats); in fore200e_shutdown()
375 free_irq(fore200e->irq, fore200e->atm_dev); in fore200e_shutdown()
387 fore200e_dma_chunk_free(fore200e, &fore200e->host_rxq.status); in fore200e_shutdown()
388 fore200e_dma_chunk_free(fore200e, &fore200e->host_rxq.rpd); in fore200e_shutdown()
392 fore200e_dma_chunk_free(fore200e, &fore200e->host_txq.status); in fore200e_shutdown()
393 fore200e_dma_chunk_free(fore200e, &fore200e->host_txq.tpd); in fore200e_shutdown()
397 fore200e_dma_chunk_free(fore200e, &fore200e->host_cmdq.status); in fore200e_shutdown()
410 fore200e->bus->unmap(fore200e); in fore200e_shutdown()
418 atm_dev_deregister(fore200e->atm_dev); in fore200e_shutdown()
432 /* on big-endian hosts, the board is configured to convert in fore200e_pca_read()
440 /* on big-endian hosts, the board is configured to convert in fore200e_pca_write()
449 int irq_posted = readl(fore200e->regs.pca.psr); in fore200e_pca_irq_check()
452 if (irq_posted && (readl(fore200e->regs.pca.hcr) & PCA200E_HCR_OUTFULL)) { in fore200e_pca_irq_check()
453 DPRINTK(2,"FIFO OUT full, device %d\n", fore200e->atm_dev->number); in fore200e_pca_irq_check()
464 writel(PCA200E_HCR_CLRINTR, fore200e->regs.pca.hcr); in fore200e_pca_irq_ack()
471 writel(PCA200E_HCR_RESET, fore200e->regs.pca.hcr); in fore200e_pca_reset()
473 writel(0, fore200e->regs.pca.hcr); in fore200e_pca_reset()
479 DPRINTK(2, "device %s being mapped in memory\n", fore200e->name); in fore200e_pca_map()
481 fore200e->virt_base = ioremap(fore200e->phys_base, PCA200E_IOSPACE_LENGTH); in fore200e_pca_map()
483 if (fore200e->virt_base == NULL) { in fore200e_pca_map()
484 printk(FORE200E "can't map device %s\n", fore200e->name); in fore200e_pca_map()
485 return -EFAULT; in fore200e_pca_map()
488 DPRINTK(1, "device %s mapped to 0x%p\n", fore200e->name, fore200e->virt_base); in fore200e_pca_map()
491 fore200e->regs.pca.hcr = fore200e->virt_base + PCA200E_HCR_OFFSET; in fore200e_pca_map()
492 fore200e->regs.pca.imr = fore200e->virt_base + PCA200E_IMR_OFFSET; in fore200e_pca_map()
493 fore200e->regs.pca.psr = fore200e->virt_base + PCA200E_PSR_OFFSET; in fore200e_pca_map()
495 fore200e->state = FORE200E_STATE_MAP; in fore200e_pca_map()
503 DPRINTK(2, "device %s being unmapped from memory\n", fore200e->name); in fore200e_pca_unmap()
505 if (fore200e->virt_base != NULL) in fore200e_pca_unmap()
506 iounmap(fore200e->virt_base); in fore200e_pca_unmap()
512 struct pci_dev *pci_dev = to_pci_dev(fore200e->dev); in fore200e_pca_configure()
515 DPRINTK(2, "device %s being configured\n", fore200e->name); in fore200e_pca_configure()
517 if ((pci_dev->irq == 0) || (pci_dev->irq == 0xFF)) { in fore200e_pca_configure()
518 printk(FORE200E "incorrect IRQ setting - misconfigured PCI-PCI bridge?\n"); in fore200e_pca_configure()
519 return -EIO; in fore200e_pca_configure()
545 fore200e->state = FORE200E_STATE_CONFIGURE; in fore200e_pca_configure()
553 struct host_cmdq* cmdq = &fore200e->host_cmdq; in fore200e_pca_prom_read()
554 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ]; in fore200e_pca_prom_read()
559 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD); in fore200e_pca_prom_read()
564 prom_dma = dma_map_single(fore200e->dev, prom, sizeof(struct prom_data), in fore200e_pca_prom_read()
566 if (dma_mapping_error(fore200e->dev, prom_dma)) in fore200e_pca_prom_read()
567 return -ENOMEM; in fore200e_pca_prom_read()
569 fore200e->bus->write(prom_dma, &entry->cp_entry->cmd.prom_block.prom_haddr); in fore200e_pca_prom_read()
571 *entry->status = STATUS_PENDING; in fore200e_pca_prom_read()
573 fore200e->bus->write(*(u32*)&opcode, (u32 __iomem *)&entry->cp_entry->cmd.prom_block.opcode); in fore200e_pca_prom_read()
575 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400); in fore200e_pca_prom_read()
577 *entry->status = STATUS_FREE; in fore200e_pca_prom_read()
579 dma_unmap_single(fore200e->dev, prom_dma, sizeof(struct prom_data), DMA_FROM_DEVICE); in fore200e_pca_prom_read()
582 printk(FORE200E "unable to get PROM data from device %s\n", fore200e->name); in fore200e_pca_prom_read()
583 return -EIO; in fore200e_pca_prom_read()
590 /* MAC address is stored as little-endian */ in fore200e_pca_prom_read()
591 swap_here(&prom->mac_addr[0]); in fore200e_pca_prom_read()
592 swap_here(&prom->mac_addr[4]); in fore200e_pca_prom_read()
602 struct pci_dev *pci_dev = to_pci_dev(fore200e->dev); in fore200e_pca_proc_read()
605 pci_dev->bus->number, PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn)); in fore200e_pca_proc_read()
609 .model_name = "PCA-200E",
641 u32 hcr = fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_STICKY; in fore200e_sba_irq_enable()
642 fore200e->bus->write(hcr | SBA200E_HCR_INTR_ENA, fore200e->regs.sba.hcr); in fore200e_sba_irq_enable()
647 return fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_INTR_REQ; in fore200e_sba_irq_check()
652 u32 hcr = fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_STICKY; in fore200e_sba_irq_ack()
653 fore200e->bus->write(hcr | SBA200E_HCR_INTR_CLR, fore200e->regs.sba.hcr); in fore200e_sba_irq_ack()
658 fore200e->bus->write(SBA200E_HCR_RESET, fore200e->regs.sba.hcr); in fore200e_sba_reset()
660 fore200e->bus->write(0, fore200e->regs.sba.hcr); in fore200e_sba_reset()
665 struct platform_device *op = to_platform_device(fore200e->dev); in fore200e_sba_map()
669 fore200e->regs.sba.hcr = of_ioremap(&op->resource[0], 0, SBA200E_HCR_LENGTH, "SBA HCR"); in fore200e_sba_map()
670 fore200e->regs.sba.bsr = of_ioremap(&op->resource[1], 0, SBA200E_BSR_LENGTH, "SBA BSR"); in fore200e_sba_map()
671 fore200e->regs.sba.isr = of_ioremap(&op->resource[2], 0, SBA200E_ISR_LENGTH, "SBA ISR"); in fore200e_sba_map()
672 fore200e->virt_base = of_ioremap(&op->resource[3], 0, SBA200E_RAM_LENGTH, "SBA RAM"); in fore200e_sba_map()
674 if (!fore200e->virt_base) { in fore200e_sba_map()
675 printk(FORE200E "unable to map RAM of device %s\n", fore200e->name); in fore200e_sba_map()
676 return -EFAULT; in fore200e_sba_map()
679 DPRINTK(1, "device %s mapped to 0x%p\n", fore200e->name, fore200e->virt_base); in fore200e_sba_map()
681 fore200e->bus->write(0x02, fore200e->regs.sba.isr); /* XXX hardwired interrupt level */ in fore200e_sba_map()
684 bursts = of_getintprop_default(op->dev.of_node->parent, "burst-sizes", 0x00); in fore200e_sba_map()
687 sbus_set_sbus64(&op->dev, bursts); in fore200e_sba_map()
689 fore200e->state = FORE200E_STATE_MAP; in fore200e_sba_map()
695 struct platform_device *op = to_platform_device(fore200e->dev); in fore200e_sba_unmap()
697 of_iounmap(&op->resource[0], fore200e->regs.sba.hcr, SBA200E_HCR_LENGTH); in fore200e_sba_unmap()
698 of_iounmap(&op->resource[1], fore200e->regs.sba.bsr, SBA200E_BSR_LENGTH); in fore200e_sba_unmap()
699 of_iounmap(&op->resource[2], fore200e->regs.sba.isr, SBA200E_ISR_LENGTH); in fore200e_sba_unmap()
700 of_iounmap(&op->resource[3], fore200e->virt_base, SBA200E_RAM_LENGTH); in fore200e_sba_unmap()
705 fore200e->state = FORE200E_STATE_CONFIGURE; in fore200e_sba_configure()
711 struct platform_device *op = to_platform_device(fore200e->dev); in fore200e_sba_prom_read()
715 prop = of_get_property(op->dev.of_node, "madaddrlo2", &len); in fore200e_sba_prom_read()
717 return -ENODEV; in fore200e_sba_prom_read()
718 memcpy(&prom->mac_addr[4], prop, 4); in fore200e_sba_prom_read()
720 prop = of_get_property(op->dev.of_node, "madaddrhi4", &len); in fore200e_sba_prom_read()
722 return -ENODEV; in fore200e_sba_prom_read()
723 memcpy(&prom->mac_addr[2], prop, 4); in fore200e_sba_prom_read()
725 prom->serial_number = of_getintprop_default(op->dev.of_node, in fore200e_sba_prom_read()
727 prom->hw_revision = of_getintprop_default(op->dev.of_node, in fore200e_sba_prom_read()
735 struct platform_device *op = to_platform_device(fore200e->dev); in fore200e_sba_proc_read()
738 regs = of_get_property(op->dev.of_node, "reg", NULL); in fore200e_sba_proc_read()
741 (regs ? regs->which_io : 0), op->dev.of_node); in fore200e_sba_proc_read()
745 .model_name = "SBA-200E",
767 struct host_txq* txq = &fore200e->host_txq; in fore200e_tx_irq()
772 if (fore200e->host_txq.txing == 0) in fore200e_tx_irq()
777 entry = &txq->host_entry[ txq->tail ]; in fore200e_tx_irq()
779 if ((*entry->status & STATUS_COMPLETE) == 0) { in fore200e_tx_irq()
784 entry, txq->tail, entry->vc_map, entry->skb); in fore200e_tx_irq()
787 kfree(entry->data); in fore200e_tx_irq()
790 dma_unmap_single(fore200e->dev, entry->tpd->tsd[ 0 ].buffer, entry->tpd->tsd[ 0 ].length, in fore200e_tx_irq()
793 vc_map = entry->vc_map; in fore200e_tx_irq()
796 if ((vc_map->vcc == NULL) || in fore200e_tx_irq()
797 (test_bit(ATM_VF_READY, &vc_map->vcc->flags) == 0)) { in fore200e_tx_irq()
800 fore200e->atm_dev->number); in fore200e_tx_irq()
802 dev_kfree_skb_any(entry->skb); in fore200e_tx_irq()
805 ASSERT(vc_map->vcc); in fore200e_tx_irq()
807 /* vcc closed then immediately re-opened? */ in fore200e_tx_irq()
808 if (vc_map->incarn != entry->incarn) { in fore200e_tx_irq()
811 if the same vcc is immediately re-opened, those pending PDUs must in fore200e_tx_irq()
813 to the prior incarnation of that vcc. otherwise, sk_atm(vcc)->sk_wmem_alloc in fore200e_tx_irq()
815 leading to a negative sk->sk_wmem_alloc count, ultimately freezing the vcc. in fore200e_tx_irq()
819 of the vcc, then this implies that the vcc has been closed then re-opened. in fore200e_tx_irq()
822 DPRINTK(1, "vcc closed-then-re-opened; dropping PDU sent on device %d\n", in fore200e_tx_irq()
823 fore200e->atm_dev->number); in fore200e_tx_irq()
825 dev_kfree_skb_any(entry->skb); in fore200e_tx_irq()
828 vcc = vc_map->vcc; in fore200e_tx_irq()
832 if (vcc->pop) { in fore200e_tx_irq()
833 vcc->pop(vcc, entry->skb); in fore200e_tx_irq()
836 dev_kfree_skb_any(entry->skb); in fore200e_tx_irq()
840 if (*entry->status & STATUS_ERROR) in fore200e_tx_irq()
841 atomic_inc(&vcc->stats->tx_err); in fore200e_tx_irq()
843 atomic_inc(&vcc->stats->tx); in fore200e_tx_irq()
847 *entry->status = STATUS_FREE; in fore200e_tx_irq()
849 fore200e->host_txq.txing--; in fore200e_tx_irq()
851 FORE200E_NEXT_ENTRY(txq->tail, QUEUE_SIZE_TX); in fore200e_tx_irq()
862 buffer = bsq->freebuf; in bsq_audit()
865 if (buffer->supplied) { in bsq_audit()
867 where, scheme, magn, buffer->index); in bsq_audit()
870 if (buffer->magn != magn) { in bsq_audit()
872 where, scheme, magn, buffer->index, buffer->magn); in bsq_audit()
875 if (buffer->scheme != scheme) { in bsq_audit()
877 where, scheme, magn, buffer->index, buffer->scheme); in bsq_audit()
880 if ((buffer->index < 0) || (buffer->index >= fore200e_rx_buf_nbr[ scheme ][ magn ])) { in bsq_audit()
882 where, scheme, magn, buffer->index); in bsq_audit()
886 buffer = buffer->next; in bsq_audit()
889 if (count != bsq->freebuf_count) { in bsq_audit()
891 where, scheme, magn, count, bsq->freebuf_count); in bsq_audit()
910 bsq = &fore200e->host_bsq[ scheme ][ magn ]; in fore200e_supply()
915 while (bsq->freebuf_count >= RBD_BLK_SIZE) { in fore200e_supply()
918 RBD_BLK_SIZE, scheme, magn, bsq->freebuf_count); in fore200e_supply()
920 entry = &bsq->host_entry[ bsq->head ]; in fore200e_supply()
925 buffer = bsq->freebuf; in fore200e_supply()
928 scheme, magn, bsq->freebuf_count); in fore200e_supply()
931 bsq->freebuf = buffer->next; in fore200e_supply()
934 if (buffer->supplied) in fore200e_supply()
936 scheme, magn, buffer->index); in fore200e_supply()
937 buffer->supplied = 1; in fore200e_supply()
939 entry->rbd_block->rbd[ i ].buffer_haddr = buffer->data.dma_addr; in fore200e_supply()
940 entry->rbd_block->rbd[ i ].handle = FORE200E_BUF2HDL(buffer); in fore200e_supply()
943 FORE200E_NEXT_ENTRY(bsq->head, QUEUE_SIZE_BS); in fore200e_supply()
946 bsq->freebuf_count -= RBD_BLK_SIZE; in fore200e_supply()
948 *entry->status = STATUS_PENDING; in fore200e_supply()
949 fore200e->bus->write(entry->rbd_block_dma, &entry->cp_entry->rbd_block_haddr); in fore200e_supply()
973 if ((vcc->qos.aal == ATM_AAL0) && (vcc->qos.rxtp.max_sdu == ATM_AAL0_SDU)) { in fore200e_push_rpd()
975 cell_header = (rpd->atm_header.gfc << ATM_HDR_GFC_SHIFT) | in fore200e_push_rpd()
976 (rpd->atm_header.vpi << ATM_HDR_VPI_SHIFT) | in fore200e_push_rpd()
977 (rpd->atm_header.vci << ATM_HDR_VCI_SHIFT) | in fore200e_push_rpd()
978 (rpd->atm_header.plt << ATM_HDR_PTI_SHIFT) | in fore200e_push_rpd()
979 rpd->atm_header.clp; in fore200e_push_rpd()
985 for (i = 0; i < rpd->nseg; i++) in fore200e_push_rpd()
986 pdu_len += rpd->rsd[ i ].length; in fore200e_push_rpd()
992 atomic_inc(&vcc->stats->rx_drop); in fore200e_push_rpd()
993 return -ENOMEM; in fore200e_push_rpd()
1005 for (i = 0; i < rpd->nseg; i++) { in fore200e_push_rpd()
1008 buffer = FORE200E_HDL2BUF(rpd->rsd[ i ].handle); in fore200e_push_rpd()
1011 dma_sync_single_for_cpu(fore200e->dev, buffer->data.dma_addr, in fore200e_push_rpd()
1012 rpd->rsd[i].length, DMA_FROM_DEVICE); in fore200e_push_rpd()
1014 skb_put_data(skb, buffer->data.align_addr, rpd->rsd[i].length); in fore200e_push_rpd()
1017 dma_sync_single_for_device(fore200e->dev, buffer->data.dma_addr, in fore200e_push_rpd()
1018 rpd->rsd[i].length, DMA_FROM_DEVICE); in fore200e_push_rpd()
1021 DPRINTK(3, "rx skb: len = %d, truesize = %d\n", skb->len, skb->truesize); in fore200e_push_rpd()
1023 if (pdu_len < fore200e_vcc->rx_min_pdu) in fore200e_push_rpd()
1024 fore200e_vcc->rx_min_pdu = pdu_len; in fore200e_push_rpd()
1025 if (pdu_len > fore200e_vcc->rx_max_pdu) in fore200e_push_rpd()
1026 fore200e_vcc->rx_max_pdu = pdu_len; in fore200e_push_rpd()
1027 fore200e_vcc->rx_pdu++; in fore200e_push_rpd()
1030 if (atm_charge(vcc, skb->truesize) == 0) { in fore200e_push_rpd()
1032 DPRINTK(2, "receive buffers saturated for %d.%d.%d - PDU dropped\n", in fore200e_push_rpd()
1033 vcc->itf, vcc->vpi, vcc->vci); in fore200e_push_rpd()
1037 atomic_inc(&vcc->stats->rx_drop); in fore200e_push_rpd()
1038 return -ENOMEM; in fore200e_push_rpd()
1041 vcc->push(vcc, skb); in fore200e_push_rpd()
1042 atomic_inc(&vcc->stats->rx); in fore200e_push_rpd()
1055 for (i = 0; i < rpd->nseg; i++) { in fore200e_collect_rpd()
1058 buffer = FORE200E_HDL2BUF(rpd->rsd[ i ].handle); in fore200e_collect_rpd()
1060 bsq = &fore200e->host_bsq[ buffer->scheme ][ buffer->magn ]; in fore200e_collect_rpd()
1063 bsq_audit(2, bsq, buffer->scheme, buffer->magn); in fore200e_collect_rpd()
1065 if (buffer->supplied == 0) in fore200e_collect_rpd()
1067 buffer->scheme, buffer->magn, buffer->index); in fore200e_collect_rpd()
1068 buffer->supplied = 0; in fore200e_collect_rpd()
1071 /* re-insert the buffer into the free buffer list */ in fore200e_collect_rpd()
1072 buffer->next = bsq->freebuf; in fore200e_collect_rpd()
1073 bsq->freebuf = buffer; in fore200e_collect_rpd()
1076 bsq->freebuf_count++; in fore200e_collect_rpd()
1084 struct host_rxq* rxq = &fore200e->host_rxq; in fore200e_rx_irq()
1091 entry = &rxq->host_entry[ rxq->head ]; in fore200e_rx_irq()
1094 if ((*entry->status & STATUS_COMPLETE) == 0) in fore200e_rx_irq()
1097 vc_map = FORE200E_VC_MAP(fore200e, entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci); in fore200e_rx_irq()
1099 if ((vc_map->vcc == NULL) || in fore200e_rx_irq()
1100 (test_bit(ATM_VF_READY, &vc_map->vcc->flags) == 0)) { in fore200e_rx_irq()
1103 fore200e->atm_dev->number, in fore200e_rx_irq()
1104 entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci); in fore200e_rx_irq()
1107 vcc = vc_map->vcc; in fore200e_rx_irq()
1110 if ((*entry->status & STATUS_ERROR) == 0) { in fore200e_rx_irq()
1112 fore200e_push_rpd(fore200e, vcc, entry->rpd); in fore200e_rx_irq()
1116 fore200e->atm_dev->number, in fore200e_rx_irq()
1117 entry->rpd->atm_header.vpi, entry->rpd->atm_header.vci); in fore200e_rx_irq()
1118 atomic_inc(&vcc->stats->rx_err); in fore200e_rx_irq()
1122 FORE200E_NEXT_ENTRY(rxq->head, QUEUE_SIZE_RX); in fore200e_rx_irq()
1124 fore200e_collect_rpd(fore200e, entry->rpd); in fore200e_rx_irq()
1127 fore200e->bus->write(entry->rpd_dma, &entry->cp_entry->rpd_haddr); in fore200e_rx_irq()
1128 *entry->status = STATUS_FREE; in fore200e_rx_irq()
1141 spin_lock_irqsave(&fore200e->q_lock, flags); in fore200e_irq()
1143 spin_unlock_irqrestore(&fore200e->q_lock, flags); in fore200e_irq()
1145 spin_lock_irqsave(&fore200e->q_lock, flags); in fore200e_irq()
1147 spin_unlock_irqrestore(&fore200e->q_lock, flags); in fore200e_irq()
1157 if (fore200e->bus->irq_check(fore200e) == 0) { in fore200e_interrupt()
1159 DPRINTK(3, "interrupt NOT triggered by device %d\n", fore200e->atm_dev->number); in fore200e_interrupt()
1162 DPRINTK(3, "interrupt triggered by device %d\n", fore200e->atm_dev->number); in fore200e_interrupt()
1165 tasklet_schedule(&fore200e->tx_tasklet); in fore200e_interrupt()
1166 tasklet_schedule(&fore200e->rx_tasklet); in fore200e_interrupt()
1171 fore200e->bus->irq_ack(fore200e); in fore200e_interrupt()
1183 DPRINTK(3, "tx tasklet scheduled for device %d\n", fore200e->atm_dev->number); in fore200e_tx_tasklet()
1185 spin_lock_irqsave(&fore200e->q_lock, flags); in fore200e_tx_tasklet()
1187 spin_unlock_irqrestore(&fore200e->q_lock, flags); in fore200e_tx_tasklet()
1197 DPRINTK(3, "rx tasklet scheduled for device %d\n", fore200e->atm_dev->number); in fore200e_rx_tasklet()
1199 spin_lock_irqsave(&fore200e->q_lock, flags); in fore200e_rx_tasklet()
1201 spin_unlock_irqrestore(&fore200e->q_lock, flags); in fore200e_rx_tasklet()
1210 int scheme = vcc->vci % 2 ? BUFFER_SCHEME_ONE : BUFFER_SCHEME_TWO; in fore200e_select_scheme()
1213 vcc->itf, vcc->vpi, vcc->vci, scheme); in fore200e_select_scheme()
1222 struct host_cmdq* cmdq = &fore200e->host_cmdq; in fore200e_activate_vcin()
1223 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ]; in fore200e_activate_vcin()
1228 enum fore200e_aal aal = fore200e_atm2fore_aal(vcc->qos.aal); in fore200e_activate_vcin()
1230 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD); in fore200e_activate_vcin()
1233 FORE200E_VCC(vcc)->scheme = fore200e_select_scheme(vcc); in fore200e_activate_vcin()
1237 activ_opcode.scheme = FORE200E_VCC(vcc)->scheme; in fore200e_activate_vcin()
1245 vpvc.vci = vcc->vci; in fore200e_activate_vcin()
1246 vpvc.vpi = vcc->vpi; in fore200e_activate_vcin()
1248 *entry->status = STATUS_PENDING; in fore200e_activate_vcin()
1256 fore200e->bus->write(mtu, &entry->cp_entry->cmd.activate_block.mtu); in fore200e_activate_vcin()
1257 …fore200e->bus->write(*(u32*)&vpvc, (u32 __iomem *)&entry->cp_entry->cmd.activate_block.vpv… in fore200e_activate_vcin()
1258 …fore200e->bus->write(*(u32*)&activ_opcode, (u32 __iomem *)&entry->cp_entry->cmd.activate_block.opc… in fore200e_activate_vcin()
1261 …fore200e->bus->write(*(u32*)&vpvc, (u32 __iomem *)&entry->cp_entry->cmd.deactivate_block.v… in fore200e_activate_vcin()
1262 …fore200e->bus->write(*(u32*)&deactiv_opcode, (u32 __iomem *)&entry->cp_entry->cmd.deactivate_block… in fore200e_activate_vcin()
1265 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400); in fore200e_activate_vcin()
1267 *entry->status = STATUS_FREE; in fore200e_activate_vcin()
1271 activate ? "open" : "close", vcc->itf, vcc->vpi, vcc->vci); in fore200e_activate_vcin()
1272 return -EIO; in fore200e_activate_vcin()
1275 DPRINTK(1, "VC %d.%d.%d %sed\n", vcc->itf, vcc->vpi, vcc->vci, in fore200e_activate_vcin()
1287 if (qos->txtp.max_pcr < ATM_OC3_PCR) { in fore200e_rate_ctrl()
1290 rate->data_cells = qos->txtp.max_pcr * FORE200E_MAX_BACK2BACK_CELLS / ATM_OC3_PCR; in fore200e_rate_ctrl()
1291 rate->idle_cells = FORE200E_MAX_BACK2BACK_CELLS - rate->data_cells; in fore200e_rate_ctrl()
1295 rate->data_cells = rate->idle_cells = 0; in fore200e_rate_ctrl()
1303 struct fore200e* fore200e = FORE200E_DEV(vcc->dev); in fore200e_open()
1307 int vci = vcc->vci; in fore200e_open()
1308 short vpi = vcc->vpi; in fore200e_open()
1313 spin_lock_irqsave(&fore200e->q_lock, flags); in fore200e_open()
1316 if (vc_map->vcc) { in fore200e_open()
1318 spin_unlock_irqrestore(&fore200e->q_lock, flags); in fore200e_open()
1321 fore200e->atm_dev->number, vpi, vci); in fore200e_open()
1323 return -EINVAL; in fore200e_open()
1326 vc_map->vcc = vcc; in fore200e_open()
1328 spin_unlock_irqrestore(&fore200e->q_lock, flags); in fore200e_open()
1332 vc_map->vcc = NULL; in fore200e_open()
1333 return -ENOMEM; in fore200e_open()
1336 DPRINTK(2, "opening %d.%d.%d:%d QoS = (tx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d; " in fore200e_open()
1337 "rx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d)\n", in fore200e_open()
1338 vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal), in fore200e_open()
1339 fore200e_traffic_class[ vcc->qos.txtp.traffic_class ], in fore200e_open()
1340 vcc->qos.txtp.min_pcr, vcc->qos.txtp.max_pcr, vcc->qos.txtp.max_cdv, vcc->qos.txtp.max_sdu, in fore200e_open()
1341 fore200e_traffic_class[ vcc->qos.rxtp.traffic_class ], in fore200e_open()
1342 vcc->qos.rxtp.min_pcr, vcc->qos.rxtp.max_pcr, vcc->qos.rxtp.max_cdv, vcc->qos.rxtp.max_sdu); in fore200e_open()
1344 /* pseudo-CBR bandwidth requested? */ in fore200e_open()
1345 if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) { in fore200e_open()
1347 mutex_lock(&fore200e->rate_mtx); in fore200e_open()
1348 if (fore200e->available_cell_rate < vcc->qos.txtp.max_pcr) { in fore200e_open()
1349 mutex_unlock(&fore200e->rate_mtx); in fore200e_open()
1352 vc_map->vcc = NULL; in fore200e_open()
1353 return -EAGAIN; in fore200e_open()
1357 fore200e->available_cell_rate -= vcc->qos.txtp.max_pcr; in fore200e_open()
1358 mutex_unlock(&fore200e->rate_mtx); in fore200e_open()
1361 vcc->itf = vcc->dev->number; in fore200e_open()
1363 set_bit(ATM_VF_PARTIAL,&vcc->flags); in fore200e_open()
1364 set_bit(ATM_VF_ADDR, &vcc->flags); in fore200e_open()
1366 vcc->dev_data = fore200e_vcc; in fore200e_open()
1368 if (fore200e_activate_vcin(fore200e, 1, vcc, vcc->qos.rxtp.max_sdu) < 0) { in fore200e_open()
1370 vc_map->vcc = NULL; in fore200e_open()
1372 clear_bit(ATM_VF_ADDR, &vcc->flags); in fore200e_open()
1373 clear_bit(ATM_VF_PARTIAL,&vcc->flags); in fore200e_open()
1375 vcc->dev_data = NULL; in fore200e_open()
1377 fore200e->available_cell_rate += vcc->qos.txtp.max_pcr; in fore200e_open()
1380 return -EINVAL; in fore200e_open()
1384 if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) { in fore200e_open()
1386 fore200e_rate_ctrl(&vcc->qos, &fore200e_vcc->rate); in fore200e_open()
1387 set_bit(ATM_VF_HASQOS, &vcc->flags); in fore200e_open()
1390 vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal), in fore200e_open()
1391 vcc->qos.txtp.max_pcr, vcc->qos.rxtp.max_pcr, in fore200e_open()
1392 fore200e_vcc->rate.data_cells, fore200e_vcc->rate.idle_cells); in fore200e_open()
1395 fore200e_vcc->tx_min_pdu = fore200e_vcc->rx_min_pdu = MAX_PDU_SIZE + 1; in fore200e_open()
1396 fore200e_vcc->tx_max_pdu = fore200e_vcc->rx_max_pdu = 0; in fore200e_open()
1397 fore200e_vcc->tx_pdu = fore200e_vcc->rx_pdu = 0; in fore200e_open()
1400 vc_map->incarn = ++fore200e->incarn_count; in fore200e_open()
1403 set_bit(ATM_VF_READY, &vcc->flags); in fore200e_open()
1418 fore200e = FORE200E_DEV(vcc->dev); in fore200e_close()
1420 ASSERT((vcc->vpi >= 0) && (vcc->vpi < 1<<FORE200E_VPI_BITS)); in fore200e_close()
1421 ASSERT((vcc->vci >= 0) && (vcc->vci < 1<<FORE200E_VCI_BITS)); in fore200e_close()
1423 …DPRINTK(2, "closing %d.%d.%d:%d\n", vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.a… in fore200e_close()
1425 clear_bit(ATM_VF_READY, &vcc->flags); in fore200e_close()
1429 spin_lock_irqsave(&fore200e->q_lock, flags); in fore200e_close()
1431 vc_map = FORE200E_VC_MAP(fore200e, vcc->vpi, vcc->vci); in fore200e_close()
1434 vc_map->vcc = NULL; in fore200e_close()
1436 vcc->itf = vcc->vci = vcc->vpi = 0; in fore200e_close()
1439 vcc->dev_data = NULL; in fore200e_close()
1441 spin_unlock_irqrestore(&fore200e->q_lock, flags); in fore200e_close()
1444 if ((vcc->qos.txtp.traffic_class == ATM_CBR) && (vcc->qos.txtp.max_pcr > 0)) { in fore200e_close()
1446 mutex_lock(&fore200e->rate_mtx); in fore200e_close()
1447 fore200e->available_cell_rate += vcc->qos.txtp.max_pcr; in fore200e_close()
1448 mutex_unlock(&fore200e->rate_mtx); in fore200e_close()
1450 clear_bit(ATM_VF_HASQOS, &vcc->flags); in fore200e_close()
1453 clear_bit(ATM_VF_ADDR, &vcc->flags); in fore200e_close()
1454 clear_bit(ATM_VF_PARTIAL,&vcc->flags); in fore200e_close()
1473 int tx_len = skb->len; in fore200e_send()
1481 return -EINVAL; in fore200e_send()
1483 fore200e = FORE200E_DEV(vcc->dev); in fore200e_send()
1487 return -EINVAL; in fore200e_send()
1489 txq = &fore200e->host_txq; in fore200e_send()
1491 return -EINVAL; in fore200e_send()
1493 if (!test_bit(ATM_VF_READY, &vcc->flags)) { in fore200e_send()
1494 DPRINTK(1, "VC %d.%d.%d not ready for tx\n", vcc->itf, vcc->vpi, vcc->vpi); in fore200e_send()
1496 return -EINVAL; in fore200e_send()
1500 if ((vcc->qos.aal == ATM_AAL0) && (vcc->qos.txtp.max_sdu == ATM_AAL0_SDU)) { in fore200e_send()
1501 cell_header = (u32*) skb->data; in fore200e_send()
1502 skb_data = skb->data + 4; /* skip 4-byte cell header */ in fore200e_send()
1503 skb_len = tx_len = skb->len - 4; in fore200e_send()
1505 DPRINTK(3, "user-supplied cell header = 0x%08x\n", *cell_header); in fore200e_send()
1510 skb_data = skb->data; in fore200e_send()
1511 skb_len = skb->len; in fore200e_send()
1516 DPRINTK(2, "misaligned tx PDU on device %s\n", fore200e->name); in fore200e_send()
1521 if ((vcc->qos.aal == ATM_AAL0) && (skb_len % ATM_CELL_PAYLOAD)) { in fore200e_send()
1524 DPRINTK(2, "incomplete tx AAL0 PDU on device %s\n", fore200e->name); in fore200e_send()
1532 if (vcc->pop) { in fore200e_send()
1533 vcc->pop(vcc, skb); in fore200e_send()
1538 return -ENOMEM; in fore200e_send()
1543 memset(data + skb_len, 0x00, tx_len - skb_len); in fore200e_send()
1549 vc_map = FORE200E_VC_MAP(fore200e, vcc->vpi, vcc->vci); in fore200e_send()
1550 ASSERT(vc_map->vcc == vcc); in fore200e_send()
1554 spin_lock_irqsave(&fore200e->q_lock, flags); in fore200e_send()
1556 entry = &txq->host_entry[ txq->head ]; in fore200e_send()
1558 if ((*entry->status != STATUS_FREE) || (txq->txing >= QUEUE_SIZE_TX - 2)) { in fore200e_send()
1563 if (*entry->status != STATUS_FREE) { in fore200e_send()
1565 spin_unlock_irqrestore(&fore200e->q_lock, flags); in fore200e_send()
1568 if (--retry > 0) { in fore200e_send()
1573 atomic_inc(&vcc->stats->tx_err); in fore200e_send()
1575 fore200e->tx_sat++; in fore200e_send()
1576 DPRINTK(2, "tx queue of device %s is saturated, PDU dropped - heartbeat is %08x\n", in fore200e_send()
1577 fore200e->name, fore200e->cp_queues->heartbeat); in fore200e_send()
1578 if (vcc->pop) { in fore200e_send()
1579 vcc->pop(vcc, skb); in fore200e_send()
1588 return -ENOBUFS; in fore200e_send()
1592 entry->incarn = vc_map->incarn; in fore200e_send()
1593 entry->vc_map = vc_map; in fore200e_send()
1594 entry->skb = skb; in fore200e_send()
1595 entry->data = tx_copy ? data : NULL; in fore200e_send()
1597 tpd = entry->tpd; in fore200e_send()
1598 tpd->tsd[ 0 ].buffer = dma_map_single(fore200e->dev, data, tx_len, in fore200e_send()
1600 if (dma_mapping_error(fore200e->dev, tpd->tsd[0].buffer)) { in fore200e_send()
1603 spin_unlock_irqrestore(&fore200e->q_lock, flags); in fore200e_send()
1604 return -ENOMEM; in fore200e_send()
1606 tpd->tsd[ 0 ].length = tx_len; in fore200e_send()
1608 FORE200E_NEXT_ENTRY(txq->head, QUEUE_SIZE_TX); in fore200e_send()
1609 txq->txing++; in fore200e_send()
1616 vcc->itf, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal), in fore200e_send()
1617 tpd->tsd[0].length, skb_len); in fore200e_send()
1619 if (skb_len < fore200e_vcc->tx_min_pdu) in fore200e_send()
1620 fore200e_vcc->tx_min_pdu = skb_len; in fore200e_send()
1621 if (skb_len > fore200e_vcc->tx_max_pdu) in fore200e_send()
1622 fore200e_vcc->tx_max_pdu = skb_len; in fore200e_send()
1623 fore200e_vcc->tx_pdu++; in fore200e_send()
1626 tpd->rate.data_cells = fore200e_vcc->rate.data_cells; in fore200e_send()
1627 tpd->rate.idle_cells = fore200e_vcc->rate.idle_cells; in fore200e_send()
1630 tpd->atm_header.clp = (*cell_header & ATM_HDR_CLP); in fore200e_send()
1631 tpd->atm_header.plt = (*cell_header & ATM_HDR_PTI_MASK) >> ATM_HDR_PTI_SHIFT; in fore200e_send()
1632 tpd->atm_header.vci = (*cell_header & ATM_HDR_VCI_MASK) >> ATM_HDR_VCI_SHIFT; in fore200e_send()
1633 tpd->atm_header.vpi = (*cell_header & ATM_HDR_VPI_MASK) >> ATM_HDR_VPI_SHIFT; in fore200e_send()
1634 tpd->atm_header.gfc = (*cell_header & ATM_HDR_GFC_MASK) >> ATM_HDR_GFC_SHIFT; in fore200e_send()
1638 tpd->atm_header.clp = 0; in fore200e_send()
1639 tpd->atm_header.plt = 0; in fore200e_send()
1640 tpd->atm_header.vci = vcc->vci; in fore200e_send()
1641 tpd->atm_header.vpi = vcc->vpi; in fore200e_send()
1642 tpd->atm_header.gfc = 0; in fore200e_send()
1645 tpd->spec.length = tx_len; in fore200e_send()
1646 tpd->spec.nseg = 1; in fore200e_send()
1647 tpd->spec.aal = fore200e_atm2fore_aal(vcc->qos.aal); in fore200e_send()
1648 tpd->spec.intr = 1; in fore200e_send()
1652 …tpd_haddr.haddr = entry->tpd_dma >> TPD_HADDR_SHIFT; /* shift the address, as we are in a… in fore200e_send()
1654 *entry->status = STATUS_PENDING; in fore200e_send()
1655 fore200e->bus->write(*(u32*)&tpd_haddr, (u32 __iomem *)&entry->cp_entry->tpd_haddr); in fore200e_send()
1657 spin_unlock_irqrestore(&fore200e->q_lock, flags); in fore200e_send()
1666 struct host_cmdq* cmdq = &fore200e->host_cmdq; in fore200e_getstats()
1667 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ]; in fore200e_getstats()
1672 if (fore200e->stats == NULL) { in fore200e_getstats()
1673 fore200e->stats = kzalloc(sizeof(struct stats), GFP_KERNEL); in fore200e_getstats()
1674 if (fore200e->stats == NULL) in fore200e_getstats()
1675 return -ENOMEM; in fore200e_getstats()
1678 stats_dma_addr = dma_map_single(fore200e->dev, fore200e->stats, in fore200e_getstats()
1680 if (dma_mapping_error(fore200e->dev, stats_dma_addr)) in fore200e_getstats()
1681 return -ENOMEM; in fore200e_getstats()
1683 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD); in fore200e_getstats()
1688 fore200e->bus->write(stats_dma_addr, &entry->cp_entry->cmd.stats_block.stats_haddr); in fore200e_getstats()
1690 *entry->status = STATUS_PENDING; in fore200e_getstats()
1692 fore200e->bus->write(*(u32*)&opcode, (u32 __iomem *)&entry->cp_entry->cmd.stats_block.opcode); in fore200e_getstats()
1694 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400); in fore200e_getstats()
1696 *entry->status = STATUS_FREE; in fore200e_getstats()
1698 dma_unmap_single(fore200e->dev, stats_dma_addr, sizeof(struct stats), DMA_FROM_DEVICE); in fore200e_getstats()
1701 printk(FORE200E "unable to get statistics from device %s\n", fore200e->name); in fore200e_getstats()
1702 return -EIO; in fore200e_getstats()
1712 struct host_cmdq* cmdq = &fore200e->host_cmdq;
1713 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ];
1718 …oc3_regs_dma_addr = fore200e->bus->dma_map(fore200e, regs, sizeof(struct oc3_regs), DMA_FROM_DEVIC…
1720 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD);
1727 fore200e->bus->write(oc3_regs_dma_addr, &entry->cp_entry->cmd.oc3_block.regs_haddr);
1729 *entry->status = STATUS_PENDING;
1731 fore200e->bus->write(*(u32*)&opcode, (u32*)&entry->cp_entry->cmd.oc3_block.opcode);
1733 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400);
1735 *entry->status = STATUS_FREE;
1737 fore200e->bus->dma_unmap(fore200e, oc3_regs_dma_addr, sizeof(struct oc3_regs), DMA_FROM_DEVICE);
1740 printk(FORE200E "unable to get OC-3 regs of device %s\n", fore200e->name);
1741 return -EIO;
1752 struct host_cmdq* cmdq = &fore200e->host_cmdq; in fore200e_set_oc3()
1753 struct host_cmdq_entry* entry = &cmdq->host_entry[ cmdq->head ]; in fore200e_set_oc3()
1757 DPRINTK(2, "set OC-3 reg = 0x%02x, value = 0x%02x, mask = 0x%02x\n", reg, value, mask); in fore200e_set_oc3()
1759 FORE200E_NEXT_ENTRY(cmdq->head, QUEUE_SIZE_CMD); in fore200e_set_oc3()
1766 fore200e->bus->write(0, &entry->cp_entry->cmd.oc3_block.regs_haddr); in fore200e_set_oc3()
1768 *entry->status = STATUS_PENDING; in fore200e_set_oc3()
1770 fore200e->bus->write(*(u32*)&opcode, (u32 __iomem *)&entry->cp_entry->cmd.oc3_block.opcode); in fore200e_set_oc3()
1772 ok = fore200e_poll(fore200e, entry->status, STATUS_COMPLETE, 400); in fore200e_set_oc3()
1774 *entry->status = STATUS_FREE; in fore200e_set_oc3()
1777 printk(FORE200E "unable to set OC-3 reg 0x%02x of device %s\n", reg, fore200e->name); in fore200e_set_oc3()
1778 return -EIO; in fore200e_set_oc3()
1792 return -EPERM; in fore200e_setloop()
1810 return -EINVAL; in fore200e_setloop()
1815 fore200e->loop_mode = loop_mode; in fore200e_setloop()
1827 return -EIO; in fore200e_fetch_stats()
1829 tmp.section_bip = be32_to_cpu(fore200e->stats->oc3.section_bip8_errors); in fore200e_fetch_stats()
1830 tmp.line_bip = be32_to_cpu(fore200e->stats->oc3.line_bip24_errors); in fore200e_fetch_stats()
1831 tmp.path_bip = be32_to_cpu(fore200e->stats->oc3.path_bip8_errors); in fore200e_fetch_stats()
1832 tmp.line_febe = be32_to_cpu(fore200e->stats->oc3.line_febe_errors); in fore200e_fetch_stats()
1833 tmp.path_febe = be32_to_cpu(fore200e->stats->oc3.path_febe_errors); in fore200e_fetch_stats()
1834 tmp.corr_hcs = be32_to_cpu(fore200e->stats->oc3.corr_hcs_errors); in fore200e_fetch_stats()
1835 tmp.uncorr_hcs = be32_to_cpu(fore200e->stats->oc3.ucorr_hcs_errors); in fore200e_fetch_stats()
1836 tmp.tx_cells = be32_to_cpu(fore200e->stats->aal0.cells_transmitted) + in fore200e_fetch_stats()
1837 be32_to_cpu(fore200e->stats->aal34.cells_transmitted) + in fore200e_fetch_stats()
1838 be32_to_cpu(fore200e->stats->aal5.cells_transmitted); in fore200e_fetch_stats()
1839 tmp.rx_cells = be32_to_cpu(fore200e->stats->aal0.cells_received) + in fore200e_fetch_stats()
1840 be32_to_cpu(fore200e->stats->aal34.cells_received) + in fore200e_fetch_stats()
1841 be32_to_cpu(fore200e->stats->aal5.cells_received); in fore200e_fetch_stats()
1844 return copy_to_user(arg, &tmp, sizeof(struct sonet_stats)) ? -EFAULT : 0; in fore200e_fetch_stats()
1863 return put_user(0, (int __user *)arg) ? -EFAULT : 0; in fore200e_ioctl()
1869 return put_user(fore200e->loop_mode, (int __user *)arg) ? -EFAULT : 0; in fore200e_ioctl()
1872 return put_user(ATM_LM_LOC_PHY | ATM_LM_RMT_PHY, (int __user *)arg) ? -EFAULT : 0; in fore200e_ioctl()
1875 return -ENOSYS; /* not implemented */ in fore200e_ioctl()
1883 struct fore200e* fore200e = FORE200E_DEV(vcc->dev); in fore200e_change_qos()
1885 if (!test_bit(ATM_VF_READY, &vcc->flags)) { in fore200e_change_qos()
1886 DPRINTK(1, "VC %d.%d.%d not ready for QoS change\n", vcc->itf, vcc->vpi, vcc->vpi); in fore200e_change_qos()
1887 return -EINVAL; in fore200e_change_qos()
1891 "(tx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d; " in fore200e_change_qos()
1892 "rx: cl=%s, pcr=%d-%d, cdv=%d, max_sdu=%d), flags = 0x%x\n" in fore200e_change_qos()
1894 vcc->itf, vcc->vpi, vcc->vci, in fore200e_change_qos()
1895 fore200e_traffic_class[ qos->txtp.traffic_class ], in fore200e_change_qos()
1896 qos->txtp.min_pcr, qos->txtp.max_pcr, qos->txtp.max_cdv, qos->txtp.max_sdu, in fore200e_change_qos()
1897 fore200e_traffic_class[ qos->rxtp.traffic_class ], in fore200e_change_qos()
1898 qos->rxtp.min_pcr, qos->rxtp.max_pcr, qos->rxtp.max_cdv, qos->rxtp.max_sdu, in fore200e_change_qos()
1899 flags, fore200e->available_cell_rate); in fore200e_change_qos()
1901 if ((qos->txtp.traffic_class == ATM_CBR) && (qos->txtp.max_pcr > 0)) { in fore200e_change_qos()
1903 mutex_lock(&fore200e->rate_mtx); in fore200e_change_qos()
1904 if (fore200e->available_cell_rate + vcc->qos.txtp.max_pcr < qos->txtp.max_pcr) { in fore200e_change_qos()
1905 mutex_unlock(&fore200e->rate_mtx); in fore200e_change_qos()
1906 return -EAGAIN; in fore200e_change_qos()
1909 fore200e->available_cell_rate += vcc->qos.txtp.max_pcr; in fore200e_change_qos()
1910 fore200e->available_cell_rate -= qos->txtp.max_pcr; in fore200e_change_qos()
1912 mutex_unlock(&fore200e->rate_mtx); in fore200e_change_qos()
1914 memcpy(&vcc->qos, qos, sizeof(struct atm_qos)); in fore200e_change_qos()
1917 fore200e_rate_ctrl(qos, &fore200e_vcc->rate); in fore200e_change_qos()
1919 set_bit(ATM_VF_HASQOS, &vcc->flags); in fore200e_change_qos()
1924 return -EINVAL; in fore200e_change_qos()
1930 …if (request_irq(fore200e->irq, fore200e_interrupt, IRQF_SHARED, fore200e->name, fore200e->atm_dev)… in fore200e_irq_request()
1933 fore200e_irq_itoa(fore200e->irq), fore200e->name); in fore200e_irq_request()
1934 return -EBUSY; in fore200e_irq_request()
1938 fore200e_irq_itoa(fore200e->irq), fore200e->name); in fore200e_irq_request()
1941 tasklet_init(&fore200e->tx_tasklet, fore200e_tx_tasklet, (unsigned long)fore200e); in fore200e_irq_request()
1942 tasklet_init(&fore200e->rx_tasklet, fore200e_rx_tasklet, (unsigned long)fore200e); in fore200e_irq_request()
1945 fore200e->state = FORE200E_STATE_IRQ; in fore200e_irq_request()
1956 return -ENOMEM; in fore200e_get_esi()
1958 ok = fore200e->bus->prom_read(fore200e, prom); in fore200e_get_esi()
1961 return -EBUSY; in fore200e_get_esi()
1965 fore200e->name, in fore200e_get_esi()
1966 (prom->hw_revision & 0xFF) + '@', /* probably meaningless with SBA boards */ in fore200e_get_esi()
1967 prom->serial_number & 0xFFFF, &prom->mac_addr[2]); in fore200e_get_esi()
1970 fore200e->esi[ i ] = fore200e->atm_dev->esi[ i ] = prom->mac_addr[ i + 2 ]; in fore200e_get_esi()
1989 bsq = &fore200e->host_bsq[ scheme ][ magn ]; in fore200e_alloc_rx_buf()
1997 buffer = bsq->buffer = kcalloc(nbr, sizeof(struct buffer), in fore200e_alloc_rx_buf()
2001 return -ENOMEM; in fore200e_alloc_rx_buf()
2003 bsq->freebuf = NULL; in fore200e_alloc_rx_buf()
2016 &buffer[ i ].data, size, fore200e->bus->buffer_alignment, in fore200e_alloc_rx_buf()
2020 fore200e_chunk_free(fore200e, &buffer[ --i ].data); in fore200e_alloc_rx_buf()
2023 return -ENOMEM; in fore200e_alloc_rx_buf()
2027 buffer[ i ].next = bsq->freebuf; in fore200e_alloc_rx_buf()
2028 bsq->freebuf = &buffer[ i ]; in fore200e_alloc_rx_buf()
2031 bsq->freebuf_count = nbr; in fore200e_alloc_rx_buf()
2039 fore200e->state = FORE200E_STATE_ALLOC_BUF; in fore200e_alloc_rx_buf()
2056 bsq = &fore200e->host_bsq[ scheme ][ magn ]; in fore200e_init_bs_queue()
2060 &bsq->status, in fore200e_init_bs_queue()
2063 fore200e->bus->status_alignment) < 0) { in fore200e_init_bs_queue()
2064 return -ENOMEM; in fore200e_init_bs_queue()
2069 &bsq->rbd_block, in fore200e_init_bs_queue()
2072 fore200e->bus->descr_alignment) < 0) { in fore200e_init_bs_queue()
2074 fore200e_dma_chunk_free(fore200e, &bsq->status); in fore200e_init_bs_queue()
2075 return -ENOMEM; in fore200e_init_bs_queue()
2079 cp_entry = fore200e->virt_base + in fore200e_init_bs_queue()
2080 fore200e->bus->read(&fore200e->cp_queues->cp_bsq[ scheme ][ magn ]); in fore200e_init_bs_queue()
2085 bsq->host_entry[ i ].status = in fore200e_init_bs_queue()
2086 FORE200E_INDEX(bsq->status.align_addr, enum status, i); in fore200e_init_bs_queue()
2087 bsq->host_entry[ i ].rbd_block = in fore200e_init_bs_queue()
2088 FORE200E_INDEX(bsq->rbd_block.align_addr, struct rbd_block, i); in fore200e_init_bs_queue()
2089 bsq->host_entry[ i ].rbd_block_dma = in fore200e_init_bs_queue()
2090 FORE200E_DMA_INDEX(bsq->rbd_block.dma_addr, struct rbd_block, i); in fore200e_init_bs_queue()
2091 bsq->host_entry[ i ].cp_entry = &cp_entry[ i ]; in fore200e_init_bs_queue()
2093 *bsq->host_entry[ i ].status = STATUS_FREE; in fore200e_init_bs_queue()
2095 fore200e->bus->write(FORE200E_DMA_INDEX(bsq->status.dma_addr, enum status, i), in fore200e_init_bs_queue()
2101 fore200e->state = FORE200E_STATE_INIT_BSQ; in fore200e_init_bs_queue()
2108 struct host_rxq* rxq = &fore200e->host_rxq; in fore200e_init_rx_queue()
2116 &rxq->status, in fore200e_init_rx_queue()
2119 fore200e->bus->status_alignment) < 0) { in fore200e_init_rx_queue()
2120 return -ENOMEM; in fore200e_init_rx_queue()
2125 &rxq->rpd, in fore200e_init_rx_queue()
2128 fore200e->bus->descr_alignment) < 0) { in fore200e_init_rx_queue()
2130 fore200e_dma_chunk_free(fore200e, &rxq->status); in fore200e_init_rx_queue()
2131 return -ENOMEM; in fore200e_init_rx_queue()
2135 cp_entry = fore200e->virt_base + fore200e->bus->read(&fore200e->cp_queues->cp_rxq); in fore200e_init_rx_queue()
2140 rxq->host_entry[ i ].status = in fore200e_init_rx_queue()
2141 FORE200E_INDEX(rxq->status.align_addr, enum status, i); in fore200e_init_rx_queue()
2142 rxq->host_entry[ i ].rpd = in fore200e_init_rx_queue()
2143 FORE200E_INDEX(rxq->rpd.align_addr, struct rpd, i); in fore200e_init_rx_queue()
2144 rxq->host_entry[ i ].rpd_dma = in fore200e_init_rx_queue()
2145 FORE200E_DMA_INDEX(rxq->rpd.dma_addr, struct rpd, i); in fore200e_init_rx_queue()
2146 rxq->host_entry[ i ].cp_entry = &cp_entry[ i ]; in fore200e_init_rx_queue()
2148 *rxq->host_entry[ i ].status = STATUS_FREE; in fore200e_init_rx_queue()
2150 fore200e->bus->write(FORE200E_DMA_INDEX(rxq->status.dma_addr, enum status, i), in fore200e_init_rx_queue()
2153 fore200e->bus->write(FORE200E_DMA_INDEX(rxq->rpd.dma_addr, struct rpd, i), in fore200e_init_rx_queue()
2158 rxq->head = 0; in fore200e_init_rx_queue()
2160 fore200e->state = FORE200E_STATE_INIT_RXQ; in fore200e_init_rx_queue()
2167 struct host_txq* txq = &fore200e->host_txq; in fore200e_init_tx_queue()
2175 &txq->status, in fore200e_init_tx_queue()
2178 fore200e->bus->status_alignment) < 0) { in fore200e_init_tx_queue()
2179 return -ENOMEM; in fore200e_init_tx_queue()
2184 &txq->tpd, in fore200e_init_tx_queue()
2187 fore200e->bus->descr_alignment) < 0) { in fore200e_init_tx_queue()
2189 fore200e_dma_chunk_free(fore200e, &txq->status); in fore200e_init_tx_queue()
2190 return -ENOMEM; in fore200e_init_tx_queue()
2194 cp_entry = fore200e->virt_base + fore200e->bus->read(&fore200e->cp_queues->cp_txq); in fore200e_init_tx_queue()
2199 txq->host_entry[ i ].status = in fore200e_init_tx_queue()
2200 FORE200E_INDEX(txq->status.align_addr, enum status, i); in fore200e_init_tx_queue()
2201 txq->host_entry[ i ].tpd = in fore200e_init_tx_queue()
2202 FORE200E_INDEX(txq->tpd.align_addr, struct tpd, i); in fore200e_init_tx_queue()
2203 txq->host_entry[ i ].tpd_dma = in fore200e_init_tx_queue()
2204 FORE200E_DMA_INDEX(txq->tpd.dma_addr, struct tpd, i); in fore200e_init_tx_queue()
2205 txq->host_entry[ i ].cp_entry = &cp_entry[ i ]; in fore200e_init_tx_queue()
2207 *txq->host_entry[ i ].status = STATUS_FREE; in fore200e_init_tx_queue()
2209 fore200e->bus->write(FORE200E_DMA_INDEX(txq->status.dma_addr, enum status, i), in fore200e_init_tx_queue()
2212 /* although there is a one-to-one mapping of tx queue entries and tpds, in fore200e_init_tx_queue()
2219 txq->head = 0; in fore200e_init_tx_queue()
2220 txq->tail = 0; in fore200e_init_tx_queue()
2222 fore200e->state = FORE200E_STATE_INIT_TXQ; in fore200e_init_tx_queue()
2229 struct host_cmdq* cmdq = &fore200e->host_cmdq; in fore200e_init_cmd_queue()
2237 &cmdq->status, in fore200e_init_cmd_queue()
2240 fore200e->bus->status_alignment) < 0) { in fore200e_init_cmd_queue()
2241 return -ENOMEM; in fore200e_init_cmd_queue()
2245 cp_entry = fore200e->virt_base + fore200e->bus->read(&fore200e->cp_queues->cp_cmdq); in fore200e_init_cmd_queue()
2250 cmdq->host_entry[ i ].status = in fore200e_init_cmd_queue()
2251 FORE200E_INDEX(cmdq->status.align_addr, enum status, i); in fore200e_init_cmd_queue()
2252 cmdq->host_entry[ i ].cp_entry = &cp_entry[ i ]; in fore200e_init_cmd_queue()
2254 *cmdq->host_entry[ i ].status = STATUS_FREE; in fore200e_init_cmd_queue()
2256 fore200e->bus->write(FORE200E_DMA_INDEX(cmdq->status.dma_addr, enum status, i), in fore200e_init_cmd_queue()
2261 cmdq->head = 0; in fore200e_init_cmd_queue()
2263 fore200e->state = FORE200E_STATE_INIT_CMDQ; in fore200e_init_cmd_queue()
2273 struct bs_spec __iomem * bs_spec = &fore200e->cp_queues->init.bs_spec[ scheme ][ magn ]; in fore200e_param_bs_queue()
2275 fore200e->bus->write(queue_length, &bs_spec->queue_length); in fore200e_param_bs_queue()
2276 fore200e->bus->write(fore200e_rx_buf_size[ scheme ][ magn ], &bs_spec->buffer_size); in fore200e_param_bs_queue()
2277 fore200e->bus->write(pool_size, &bs_spec->pool_size); in fore200e_param_bs_queue()
2278 fore200e->bus->write(supply_blksize, &bs_spec->supply_blksize); in fore200e_param_bs_queue()
2287 DPRINTK(2, "device %s being initialized\n", fore200e->name); in fore200e_initialize()
2289 mutex_init(&fore200e->rate_mtx); in fore200e_initialize()
2290 spin_lock_init(&fore200e->q_lock); in fore200e_initialize()
2292 cpq = fore200e->cp_queues = fore200e->virt_base + FORE200E_CP_QUEUES_OFFSET; in fore200e_initialize()
2295 fore200e->bus->write(1, &cpq->imask); in fore200e_initialize()
2297 if (fore200e->bus->irq_enable) in fore200e_initialize()
2298 fore200e->bus->irq_enable(fore200e); in fore200e_initialize()
2300 fore200e->bus->write(NBR_CONNECT, &cpq->init.num_connect); in fore200e_initialize()
2302 fore200e->bus->write(QUEUE_SIZE_CMD, &cpq->init.cmd_queue_len); in fore200e_initialize()
2303 fore200e->bus->write(QUEUE_SIZE_RX, &cpq->init.rx_queue_len); in fore200e_initialize()
2304 fore200e->bus->write(QUEUE_SIZE_TX, &cpq->init.tx_queue_len); in fore200e_initialize()
2306 fore200e->bus->write(RSD_EXTENSION, &cpq->init.rsd_extension); in fore200e_initialize()
2307 fore200e->bus->write(TSD_EXTENSION, &cpq->init.tsd_extension); in fore200e_initialize()
2317 fore200e->bus->write(STATUS_PENDING, &cpq->init.status); in fore200e_initialize()
2318 fore200e->bus->write(OPCODE_INITIALIZE, &cpq->init.opcode); in fore200e_initialize()
2320 ok = fore200e_io_poll(fore200e, &cpq->init.status, STATUS_COMPLETE, 3000); in fore200e_initialize()
2322 printk(FORE200E "device %s initialization failed\n", fore200e->name); in fore200e_initialize()
2323 return -ENODEV; in fore200e_initialize()
2326 printk(FORE200E "device %s initialized\n", fore200e->name); in fore200e_initialize()
2328 fore200e->state = FORE200E_STATE_INITIALIZE; in fore200e_initialize()
2335 struct cp_monitor __iomem * monitor = fore200e->cp_monitor; in fore200e_monitor_putc()
2340 fore200e->bus->write(((u32) c) | FORE200E_CP_MONITOR_UART_AVAIL, &monitor->soft_uart.send); in fore200e_monitor_putc()
2346 struct cp_monitor __iomem * monitor = fore200e->cp_monitor; in fore200e_monitor_getc()
2352 c = (int) fore200e->bus->read(&monitor->soft_uart.recv); in fore200e_monitor_getc()
2356 fore200e->bus->write(FORE200E_CP_MONITOR_UART_FREE, &monitor->soft_uart.recv); in fore200e_monitor_getc()
2364 return -1; in fore200e_monitor_getc()
2397 sprintf(buf, "%s%s", fore200e->bus->proc_name, FW_EXT); in fore200e_load_and_start_fw()
2398 if ((err = request_firmware(&firmware, buf, fore200e->dev)) < 0) { in fore200e_load_and_start_fw()
2399 printk(FORE200E "problem loading firmware image %s\n", fore200e->bus->model_name); in fore200e_load_and_start_fw()
2403 fw_data = (const __le32 *)firmware->data; in fore200e_load_and_start_fw()
2404 fw_size = firmware->size / sizeof(u32); in fore200e_load_and_start_fw()
2405 fw_header = (const struct fw_header *)firmware->data; in fore200e_load_and_start_fw()
2406 load_addr = fore200e->virt_base + le32_to_cpu(fw_header->load_offset); in fore200e_load_and_start_fw()
2409 fore200e->name, load_addr, fw_size); in fore200e_load_and_start_fw()
2411 if (le32_to_cpu(fw_header->magic) != FW_HEADER_MAGIC) { in fore200e_load_and_start_fw()
2412 printk(FORE200E "corrupted %s firmware image\n", fore200e->bus->model_name); in fore200e_load_and_start_fw()
2416 for (; fw_size--; fw_data++, load_addr++) in fore200e_load_and_start_fw()
2417 fore200e->bus->write(le32_to_cpu(*fw_data), load_addr); in fore200e_load_and_start_fw()
2419 DPRINTK(2, "device %s firmware being started\n", fore200e->name); in fore200e_load_and_start_fw()
2426 sprintf(buf, "\rgo %x\r", le32_to_cpu(fw_header->start_offset)); in fore200e_load_and_start_fw()
2429 if (fore200e_io_poll(fore200e, &fore200e->cp_monitor->bstat, BSTAT_CP_RUNNING, 1000) == 0) { in fore200e_load_and_start_fw()
2430 printk(FORE200E "device %s firmware didn't start\n", fore200e->name); in fore200e_load_and_start_fw()
2434 printk(FORE200E "device %s firmware started\n", fore200e->name); in fore200e_load_and_start_fw()
2436 fore200e->state = FORE200E_STATE_START_FW; in fore200e_load_and_start_fw()
2449 DPRINTK(2, "device %s being registered\n", fore200e->name); in fore200e_register()
2451 atm_dev = atm_dev_register(fore200e->bus->proc_name, parent, &fore200e_ops, in fore200e_register()
2452 -1, NULL); in fore200e_register()
2454 printk(FORE200E "unable to register device %s\n", fore200e->name); in fore200e_register()
2455 return -ENODEV; in fore200e_register()
2458 atm_dev->dev_data = fore200e; in fore200e_register()
2459 fore200e->atm_dev = atm_dev; in fore200e_register()
2461 atm_dev->ci_range.vpi_bits = FORE200E_VPI_BITS; in fore200e_register()
2462 atm_dev->ci_range.vci_bits = FORE200E_VCI_BITS; in fore200e_register()
2464 fore200e->available_cell_rate = ATM_OC3_PCR; in fore200e_register()
2466 fore200e->state = FORE200E_STATE_REGISTER; in fore200e_register()
2474 return -ENODEV; in fore200e_init()
2476 if (fore200e->bus->configure(fore200e) < 0) in fore200e_init()
2477 return -ENODEV; in fore200e_init()
2479 if (fore200e->bus->map(fore200e) < 0) in fore200e_init()
2480 return -ENODEV; in fore200e_init()
2483 return -ENODEV; in fore200e_init()
2486 return -ENODEV; in fore200e_init()
2489 return -ENODEV; in fore200e_init()
2492 return -ENOMEM; in fore200e_init()
2495 return -ENOMEM; in fore200e_init()
2498 return -ENOMEM; in fore200e_init()
2501 return -ENOMEM; in fore200e_init()
2504 return -ENOMEM; in fore200e_init()
2507 return -EIO; in fore200e_init()
2510 return -EBUSY; in fore200e_init()
2515 fore200e->state = FORE200E_STATE_COMPLETE; in fore200e_init()
2528 return -ENOMEM; in fore200e_sba_probe()
2530 fore200e->bus = &fore200e_sbus_ops; in fore200e_sba_probe()
2531 fore200e->dev = &op->dev; in fore200e_sba_probe()
2532 fore200e->irq = op->archdata.irqs[0]; in fore200e_sba_probe()
2533 fore200e->phys_base = op->resource[0].start; in fore200e_sba_probe()
2535 sprintf(fore200e->name, "SBA-200E-%d", index); in fore200e_sba_probe()
2537 err = fore200e_init(fore200e, &op->dev); in fore200e_sba_probe()
2545 dev_set_drvdata(&op->dev, fore200e); in fore200e_sba_probe()
2552 struct fore200e *fore200e = dev_get_drvdata(&op->dev); in fore200e_sba_remove()
2585 err = -EINVAL; in fore200e_pca_detect()
2589 if (dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32))) { in fore200e_pca_detect()
2590 err = -EINVAL; in fore200e_pca_detect()
2596 err = -ENOMEM; in fore200e_pca_detect()
2600 fore200e->bus = &fore200e_pci_ops; in fore200e_pca_detect()
2601 fore200e->dev = &pci_dev->dev; in fore200e_pca_detect()
2602 fore200e->irq = pci_dev->irq; in fore200e_pca_detect()
2603 fore200e->phys_base = pci_resource_start(pci_dev, 0); in fore200e_pca_detect()
2605 sprintf(fore200e->name, "PCA-200E-%d", index - 1); in fore200e_pca_detect()
2609 printk(FORE200E "device PCA-200E found at 0x%lx, IRQ %s\n", in fore200e_pca_detect()
2610 fore200e->phys_base, fore200e_irq_itoa(fore200e->irq)); in fore200e_pca_detect()
2612 sprintf(fore200e->name, "PCA-200E-%d", index); in fore200e_pca_detect()
2614 err = fore200e_init(fore200e, &pci_dev->dev); in fore200e_pca_detect()
2665 printk(FORE200E "FORE Systems 200E-series ATM driver - version " FORE200E_VERSION "\n"); in fore200e_module_init()
2704 if (!left--) { in fore200e_proc_read()
2707 return -EIO; in fore200e_proc_read()
2711 " internal name:\t\t%s\n", fore200e->name); in fore200e_proc_read()
2713 /* print bus-specific information */ in fore200e_proc_read()
2714 if (fore200e->bus->proc_read) in fore200e_proc_read()
2715 len += fore200e->bus->proc_read(fore200e, page + len); in fore200e_proc_read()
2723 fore200e_irq_itoa(fore200e->irq), in fore200e_proc_read()
2724 (void*)fore200e->phys_base, in fore200e_proc_read()
2725 fore200e->virt_base, in fore200e_proc_read()
2726 fore200e->esi, in fore200e_proc_read()
2727 fore200e->esi[4] * 256 + fore200e->esi[5]); in fore200e_proc_read()
2732 if (!left--) in fore200e_proc_read()
2738 fore200e->host_bsq[ BUFFER_SCHEME_ONE ][ BUFFER_MAGN_SMALL ].freebuf_count, in fore200e_proc_read()
2739 fore200e->host_bsq[ BUFFER_SCHEME_ONE ][ BUFFER_MAGN_LARGE ].freebuf_count, in fore200e_proc_read()
2740 fore200e->host_bsq[ BUFFER_SCHEME_TWO ][ BUFFER_MAGN_SMALL ].freebuf_count, in fore200e_proc_read()
2741 fore200e->host_bsq[ BUFFER_SCHEME_TWO ][ BUFFER_MAGN_LARGE ].freebuf_count); in fore200e_proc_read()
2743 if (!left--) { in fore200e_proc_read()
2744 u32 hb = fore200e->bus->read(&fore200e->cp_queues->heartbeat); in fore200e_proc_read()
2758 if (!left--) { in fore200e_proc_read()
2760 "unshielded twisted pair", in fore200e_proc_read()
2763 "single-mode optical fiber ST", in fore200e_proc_read()
2764 "single-mode optical fiber SC", in fore200e_proc_read()
2775 u32 fw_release = fore200e->bus->read(&fore200e->cp_queues->fw_release); in fore200e_proc_read()
2776 u32 mon960_release = fore200e->bus->read(&fore200e->cp_queues->mon960_release); in fore200e_proc_read()
2777 u32 oc3_revision = fore200e->bus->read(&fore200e->cp_queues->oc3_revision); in fore200e_proc_read()
2778 u32 media_index = FORE200E_MEDIA_INDEX(fore200e->bus->read(&fore200e->cp_queues->media_type)); in fore200e_proc_read()
2784 switch (fore200e->loop_mode) { in fore200e_proc_read()
2798 " OC-3 revision:\t\t0x%x\n" in fore200e_proc_read()
2799 " OC-3 mode:\t\t\t%s", in fore200e_proc_read()
2807 if (!left--) { in fore200e_proc_read()
2808 struct cp_monitor __iomem * cp_monitor = fore200e->cp_monitor; in fore200e_proc_read()
2815 fore200e->bus->read(&cp_monitor->mon_version), in fore200e_proc_read()
2816 fore200e->bus->read(&cp_monitor->bstat)); in fore200e_proc_read()
2819 if (!left--) in fore200e_proc_read()
2826 be32_to_cpu(fore200e->stats->phy.crc_header_errors), in fore200e_proc_read()
2827 be32_to_cpu(fore200e->stats->phy.framing_errors)); in fore200e_proc_read()
2829 if (!left--) in fore200e_proc_read()
2831 " OC-3:\n" in fore200e_proc_read()
2839 be32_to_cpu(fore200e->stats->oc3.section_bip8_errors), in fore200e_proc_read()
2840 be32_to_cpu(fore200e->stats->oc3.path_bip8_errors), in fore200e_proc_read()
2841 be32_to_cpu(fore200e->stats->oc3.line_bip24_errors), in fore200e_proc_read()
2842 be32_to_cpu(fore200e->stats->oc3.line_febe_errors), in fore200e_proc_read()
2843 be32_to_cpu(fore200e->stats->oc3.path_febe_errors), in fore200e_proc_read()
2844 be32_to_cpu(fore200e->stats->oc3.corr_hcs_errors), in fore200e_proc_read()
2845 be32_to_cpu(fore200e->stats->oc3.ucorr_hcs_errors)); in fore200e_proc_read()
2847 if (!left--) in fore200e_proc_read()
2856 be32_to_cpu(fore200e->stats->atm.cells_transmitted), in fore200e_proc_read()
2857 be32_to_cpu(fore200e->stats->atm.cells_received), in fore200e_proc_read()
2858 be32_to_cpu(fore200e->stats->atm.vpi_bad_range), in fore200e_proc_read()
2859 be32_to_cpu(fore200e->stats->atm.vpi_no_conn), in fore200e_proc_read()
2860 be32_to_cpu(fore200e->stats->atm.vci_bad_range), in fore200e_proc_read()
2861 be32_to_cpu(fore200e->stats->atm.vci_no_conn)); in fore200e_proc_read()
2863 if (!left--) in fore200e_proc_read()
2869 be32_to_cpu(fore200e->stats->aal0.cells_transmitted), in fore200e_proc_read()
2870 be32_to_cpu(fore200e->stats->aal0.cells_received), in fore200e_proc_read()
2871 be32_to_cpu(fore200e->stats->aal0.cells_dropped)); in fore200e_proc_read()
2873 if (!left--) in fore200e_proc_read()
2887 be32_to_cpu(fore200e->stats->aal34.cells_transmitted), in fore200e_proc_read()
2888 be32_to_cpu(fore200e->stats->aal34.cells_received), in fore200e_proc_read()
2889 be32_to_cpu(fore200e->stats->aal34.cells_dropped), in fore200e_proc_read()
2890 be32_to_cpu(fore200e->stats->aal34.cells_crc_errors), in fore200e_proc_read()
2891 be32_to_cpu(fore200e->stats->aal34.cells_protocol_errors), in fore200e_proc_read()
2892 be32_to_cpu(fore200e->stats->aal34.cspdus_transmitted), in fore200e_proc_read()
2893 be32_to_cpu(fore200e->stats->aal34.cspdus_received), in fore200e_proc_read()
2894 be32_to_cpu(fore200e->stats->aal34.cspdus_dropped), in fore200e_proc_read()
2895 be32_to_cpu(fore200e->stats->aal34.cspdus_protocol_errors)); in fore200e_proc_read()
2897 if (!left--) in fore200e_proc_read()
2911 be32_to_cpu(fore200e->stats->aal5.cells_transmitted), in fore200e_proc_read()
2912 be32_to_cpu(fore200e->stats->aal5.cells_received), in fore200e_proc_read()
2913 be32_to_cpu(fore200e->stats->aal5.cells_dropped), in fore200e_proc_read()
2914 be32_to_cpu(fore200e->stats->aal5.congestion_experienced), in fore200e_proc_read()
2915 be32_to_cpu(fore200e->stats->aal5.cspdus_transmitted), in fore200e_proc_read()
2916 be32_to_cpu(fore200e->stats->aal5.cspdus_received), in fore200e_proc_read()
2917 be32_to_cpu(fore200e->stats->aal5.cspdus_dropped), in fore200e_proc_read()
2918 be32_to_cpu(fore200e->stats->aal5.cspdus_crc_errors), in fore200e_proc_read()
2919 be32_to_cpu(fore200e->stats->aal5.cspdus_protocol_errors)); in fore200e_proc_read()
2921 if (!left--) in fore200e_proc_read()
2930 be32_to_cpu(fore200e->stats->aux.small_b1_failed), in fore200e_proc_read()
2931 be32_to_cpu(fore200e->stats->aux.large_b1_failed), in fore200e_proc_read()
2932 be32_to_cpu(fore200e->stats->aux.small_b2_failed), in fore200e_proc_read()
2933 be32_to_cpu(fore200e->stats->aux.large_b2_failed), in fore200e_proc_read()
2934 be32_to_cpu(fore200e->stats->aux.rpd_alloc_failed), in fore200e_proc_read()
2935 fore200e->tx_sat); in fore200e_proc_read()
2937 if (!left--) in fore200e_proc_read()
2940 fore200e->stats->aux.receive_carrier ? "ON" : "OFF!"); in fore200e_proc_read()
2942 if (!left--) { in fore200e_proc_read()
2950 vcc = fore200e->vc_map[i].vcc; in fore200e_proc_read()
2955 spin_lock_irqsave(&fore200e->q_lock, flags); in fore200e_proc_read()
2957 if (vcc && test_bit(ATM_VF_READY, &vcc->flags) && !left--) { in fore200e_proc_read()
2965 vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal), in fore200e_proc_read()
2966 fore200e_vcc->tx_pdu, in fore200e_proc_read()
2967 fore200e_vcc->tx_min_pdu > 0xFFFF ? 0 : fore200e_vcc->tx_min_pdu, in fore200e_proc_read()
2968 fore200e_vcc->tx_max_pdu, in fore200e_proc_read()
2969 fore200e_vcc->rx_pdu, in fore200e_proc_read()
2970 fore200e_vcc->rx_min_pdu > 0xFFFF ? 0 : fore200e_vcc->rx_min_pdu, in fore200e_proc_read()
2971 fore200e_vcc->rx_max_pdu); in fore200e_proc_read()
2973 spin_unlock_irqrestore(&fore200e->q_lock, flags); in fore200e_proc_read()
2977 spin_unlock_irqrestore(&fore200e->q_lock, flags); in fore200e_proc_read()