• Home
  • Raw
  • Download

Lines Matching +full:vcc +full:- +full:p

6   Copyright (C) 1999-2001  Naval Research Laboratory
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 Copyright (C) 1999-2001 Naval Research Laboratory
42 ForeRunnerHE(tm)", MANU0361-01 - Rev. A, 08/21/98.
69 #include <linux/dma-mapping.h>
88 #define hprintk(fmt,args...) printk(KERN_ERR DEV_LABEL "%d: " fmt, he_dev->number , ##args)
91 #define HPRINTK(fmt,args...) printk(KERN_DEBUG DEV_LABEL "%d: " fmt, he_dev->number , ##args)
98 static int he_open(struct atm_vcc *vcc);
99 static void he_close(struct atm_vcc *vcc);
100 static int he_send(struct atm_vcc *vcc, struct sk_buff *skb);
116 static short nvpibits = -1;
117 static short nvcibits = -1;
176 #define he_writel(dev, val, reg) do { writel(val, (dev)->membase + (reg)); wmb(); } while (0)
177 #define he_readl(dev, reg) readl((dev)->membase + (reg))
220 #define he_mkcid(dev, vpi, vci) (((vpi << (dev)->vcibits) | vci) & 0x1fff)
241 /* from page 2-20
331 struct atm_vcc *vcc; in __find_vcc() local
336 vpi = cid >> he_dev->vcibits; in __find_vcc()
337 vci = cid & ((1 << he_dev->vcibits) - 1); in __find_vcc()
338 head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)]; in __find_vcc()
341 vcc = atm_sk(s); in __find_vcc()
342 if (vcc->dev == he_dev->atm_dev && in __find_vcc()
343 vcc->vci == vci && vcc->vpi == vpi && in __find_vcc()
344 vcc->qos.rxtp.traffic_class != ATM_NONE) { in __find_vcc()
345 return vcc; in __find_vcc()
361 return -EIO; in he_init_one()
362 if (dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32)) != 0) { in he_init_one()
364 err = -EIO; in he_init_one()
368 atm_dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &he_ops, -1, NULL); in he_init_one()
370 err = -ENODEV; in he_init_one()
378 err = -ENOMEM; in he_init_one()
381 he_dev->pci_dev = pci_dev; in he_init_one()
382 he_dev->atm_dev = atm_dev; in he_init_one()
383 he_dev->atm_dev->dev_data = he_dev; in he_init_one()
384 atm_dev->dev_data = he_dev; in he_init_one()
385 he_dev->number = atm_dev->number; in he_init_one()
386 tasklet_init(&he_dev->tasklet, he_tasklet, (unsigned long) he_dev); in he_init_one()
387 spin_lock_init(&he_dev->global_lock); in he_init_one()
391 err = -ENODEV; in he_init_one()
394 he_dev->next = NULL; in he_init_one()
396 he_dev->next = he_devs; in he_init_one()
448 unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf; in he_init_rx_lbfp0()
449 unsigned lbuf_bufsize = he_dev->cells_per_lbuf * ATM_CELL_PAYLOAD; in he_init_rx_lbfp0()
450 unsigned row_offset = he_dev->r0_startrow * he_dev->bytes_per_row; in he_init_rx_lbfp0()
457 for (i = 0, lbuf_count = 0; i < he_dev->r0_numbuffs; ++i) { in he_init_rx_lbfp0()
466 row_offset += he_dev->bytes_per_row; in he_init_rx_lbfp0()
471 he_writel(he_dev, lbufd_index - 2, RLBF0_T); in he_init_rx_lbfp0()
472 he_writel(he_dev, he_dev->r0_numbuffs, RLBF0_C); in he_init_rx_lbfp0()
478 unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf; in he_init_rx_lbfp1()
479 unsigned lbuf_bufsize = he_dev->cells_per_lbuf * ATM_CELL_PAYLOAD; in he_init_rx_lbfp1()
480 unsigned row_offset = he_dev->r1_startrow * he_dev->bytes_per_row; in he_init_rx_lbfp1()
487 for (i = 0, lbuf_count = 0; i < he_dev->r1_numbuffs; ++i) { in he_init_rx_lbfp1()
496 row_offset += he_dev->bytes_per_row; in he_init_rx_lbfp1()
501 he_writel(he_dev, lbufd_index - 2, RLBF1_T); in he_init_rx_lbfp1()
502 he_writel(he_dev, he_dev->r1_numbuffs, RLBF1_C); in he_init_rx_lbfp1()
508 unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf; in he_init_tx_lbfp()
509 unsigned lbuf_bufsize = he_dev->cells_per_lbuf * ATM_CELL_PAYLOAD; in he_init_tx_lbfp()
510 unsigned row_offset = he_dev->tx_startrow * he_dev->bytes_per_row; in he_init_tx_lbfp()
512 lbufd_index = he_dev->r0_numbuffs + he_dev->r1_numbuffs; in he_init_tx_lbfp()
517 for (i = 0, lbuf_count = 0; i < he_dev->tx_numbuffs; ++i) { in he_init_tx_lbfp()
526 row_offset += he_dev->bytes_per_row; in he_init_tx_lbfp()
531 he_writel(he_dev, lbufd_index - 1, TLBF_T); in he_init_tx_lbfp()
536 he_dev->tpdrq_base = dma_alloc_coherent(&he_dev->pci_dev->dev, in he_init_tpdrq()
538 &he_dev->tpdrq_phys, in he_init_tpdrq()
540 if (he_dev->tpdrq_base == NULL) { in he_init_tpdrq()
542 return -ENOMEM; in he_init_tpdrq()
545 he_dev->tpdrq_tail = he_dev->tpdrq_base; in he_init_tpdrq()
546 he_dev->tpdrq_head = he_dev->tpdrq_base; in he_init_tpdrq()
548 he_writel(he_dev, he_dev->tpdrq_phys, TPDRQ_B_H); in he_init_tpdrq()
550 he_writel(he_dev, CONFIG_TPDRQ_SIZE - 1, TPDRQ_S); in he_init_tpdrq()
568 rate = he_dev->atm_dev->link_rate; in he_init_cs_block()
580 rate -= delta; in he_init_cs_block()
662 return -ENOMEM; in he_init_cs_block_rcm()
682 rate = he_dev->atm_dev->link_rate; in he_init_cs_block_rcm()
694 rate -= delta; in he_init_cs_block_rcm()
700 (*rategrid)[i][j] = (*rategrid)[i - 1][j] / 4; in he_init_cs_block_rcm()
702 (*rategrid)[i][j] = (*rategrid)[i - 1][j] / 2; in he_init_cs_block_rcm()
726 for (i = 255; i > 0; i--) in he_init_cs_block_rcm()
733 * there are two table entries in each 32-bit register in he_init_cs_block_rcm()
737 buf = rate_cps * he_dev->tx_numbuffs / in he_init_cs_block_rcm()
738 (he_dev->atm_dev->link_rate * 2); in he_init_cs_block_rcm()
741 mult = he_dev->atm_dev->link_rate / ATM_OC3_PCR; in he_init_cs_block_rcm()
783 he_dev->rbpl_table = kmalloc_array(BITS_TO_LONGS(RBPL_TABLE_SIZE), in he_init_group()
784 sizeof(*he_dev->rbpl_table), in he_init_group()
786 if (!he_dev->rbpl_table) { in he_init_group()
788 return -ENOMEM; in he_init_group()
790 bitmap_zero(he_dev->rbpl_table, RBPL_TABLE_SIZE); in he_init_group()
792 /* rbpl_virt 64-bit pointers */ in he_init_group()
793 he_dev->rbpl_virt = kmalloc_array(RBPL_TABLE_SIZE, in he_init_group()
794 sizeof(*he_dev->rbpl_virt), in he_init_group()
796 if (!he_dev->rbpl_virt) { in he_init_group()
802 he_dev->rbpl_pool = dma_pool_create("rbpl", &he_dev->pci_dev->dev, in he_init_group()
804 if (he_dev->rbpl_pool == NULL) { in he_init_group()
809 he_dev->rbpl_base = dma_alloc_coherent(&he_dev->pci_dev->dev, in he_init_group()
811 &he_dev->rbpl_phys, GFP_KERNEL); in he_init_group()
812 if (he_dev->rbpl_base == NULL) { in he_init_group()
817 INIT_LIST_HEAD(&he_dev->rbpl_outstanding); in he_init_group()
821 heb = dma_pool_alloc(he_dev->rbpl_pool, GFP_KERNEL, &mapping); in he_init_group()
824 heb->mapping = mapping; in he_init_group()
825 list_add(&heb->entry, &he_dev->rbpl_outstanding); in he_init_group()
827 set_bit(i, he_dev->rbpl_table); in he_init_group()
828 he_dev->rbpl_virt[i] = heb; in he_init_group()
829 he_dev->rbpl_hint = i + 1; in he_init_group()
830 he_dev->rbpl_base[i].idx = i << RBP_IDX_OFFSET; in he_init_group()
831 he_dev->rbpl_base[i].phys = mapping + offsetof(struct he_buff, data); in he_init_group()
833 he_dev->rbpl_tail = &he_dev->rbpl_base[CONFIG_RBPL_SIZE - 1]; in he_init_group()
835 he_writel(he_dev, he_dev->rbpl_phys, G0_RBPL_S + (group * 32)); in he_init_group()
836 he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), in he_init_group()
838 he_writel(he_dev, (CONFIG_RBPL_BUFSIZE - sizeof(struct he_buff))/4, in he_init_group()
842 RBP_QSIZE(CONFIG_RBPL_SIZE - 1) | in he_init_group()
848 he_dev->rbrq_base = dma_alloc_coherent(&he_dev->pci_dev->dev, in he_init_group()
850 &he_dev->rbrq_phys, GFP_KERNEL); in he_init_group()
851 if (he_dev->rbrq_base == NULL) { in he_init_group()
856 he_dev->rbrq_head = he_dev->rbrq_base; in he_init_group()
857 he_writel(he_dev, he_dev->rbrq_phys, G0_RBRQ_ST + (group * 16)); in he_init_group()
860 RBRQ_THRESH(CONFIG_RBRQ_THRESH) | RBRQ_SIZE(CONFIG_RBRQ_SIZE - 1), in he_init_group()
872 he_dev->tbrq_base = dma_alloc_coherent(&he_dev->pci_dev->dev, in he_init_group()
874 &he_dev->tbrq_phys, GFP_KERNEL); in he_init_group()
875 if (he_dev->tbrq_base == NULL) { in he_init_group()
880 he_dev->tbrq_head = he_dev->tbrq_base; in he_init_group()
882 he_writel(he_dev, he_dev->tbrq_phys, G0_TBRQ_B_T + (group * 16)); in he_init_group()
884 he_writel(he_dev, CONFIG_TBRQ_SIZE - 1, G0_TBRQ_S + (group * 16)); in he_init_group()
890 dma_free_coherent(&he_dev->pci_dev->dev, CONFIG_RBRQ_SIZE * in he_init_group()
891 sizeof(struct he_rbrq), he_dev->rbrq_base, in he_init_group()
892 he_dev->rbrq_phys); in he_init_group()
894 list_for_each_entry_safe(heb, next, &he_dev->rbpl_outstanding, entry) in he_init_group()
895 dma_pool_free(he_dev->rbpl_pool, heb, heb->mapping); in he_init_group()
897 dma_free_coherent(&he_dev->pci_dev->dev, CONFIG_RBPL_SIZE * in he_init_group()
898 sizeof(struct he_rbp), he_dev->rbpl_base, in he_init_group()
899 he_dev->rbpl_phys); in he_init_group()
901 dma_pool_destroy(he_dev->rbpl_pool); in he_init_group()
903 kfree(he_dev->rbpl_virt); in he_init_group()
905 kfree(he_dev->rbpl_table); in he_init_group()
907 return -ENOMEM; in he_init_group()
917 he_dev->irq_base = dma_alloc_coherent(&he_dev->pci_dev->dev, in he_init_irq()
919 &he_dev->irq_phys, GFP_KERNEL); in he_init_irq()
920 if (he_dev->irq_base == NULL) { in he_init_irq()
922 return -ENOMEM; in he_init_irq()
924 he_dev->irq_tailoffset = (unsigned *) in he_init_irq()
925 &he_dev->irq_base[CONFIG_IRQ_SIZE]; in he_init_irq()
926 *he_dev->irq_tailoffset = 0; in he_init_irq()
927 he_dev->irq_head = he_dev->irq_base; in he_init_irq()
928 he_dev->irq_tail = he_dev->irq_base; in he_init_irq()
931 he_dev->irq_base[i].isw = ITYPE_INVALID; in he_init_irq()
933 he_writel(he_dev, he_dev->irq_phys, IRQ0_BASE); in he_init_irq()
962 if (request_irq(he_dev->pci_dev->irq, in he_init_irq()
964 hprintk("irq %d already in use\n", he_dev->pci_dev->irq); in he_init_irq()
965 return -EINVAL; in he_init_irq()
968 he_dev->irq = he_dev->pci_dev->irq; in he_init_irq()
988 pci_dev = he_dev->pci_dev; in he_start()
991 HPRINTK("membase = 0x%lx irq = %d.\n", membase, pci_dev->irq); in he_start()
997 /* 4.3 pci bus controller-specific initialization */ in he_start()
1000 return -EINVAL; in he_start()
1005 return -EINVAL; in he_start()
1010 return -EINVAL; in he_start()
1016 return -EINVAL; in he_start()
1021 return -EINVAL; in he_start()
1032 return -EINVAL; in he_start()
1051 if (!(he_dev->membase = ioremap(membase, HE_REGMAP_SIZE))) { in he_start()
1053 return -EINVAL; in he_start()
1064 return -EINVAL; in he_start()
1075 hprintk("disabling 64-bit pci bus transfers\n"); in he_start()
1080 hprintk("64-bit transfers enabled\n"); in he_start()
1086 he_dev->prod_id[i] = read_prom_byte(he_dev, PROD_ID + i); in he_start()
1088 he_dev->media = read_prom_byte(he_dev, MEDIA); in he_start()
1091 dev->esi[i] = read_prom_byte(he_dev, MAC_ADDR + i); in he_start()
1093 hprintk("%s%s, %pM\n", he_dev->prod_id, in he_start()
1094 he_dev->media & 0x40 ? "SM" : "MM", dev->esi); in he_start()
1095 he_dev->atm_dev->link_rate = he_is622(he_dev) ? in he_start()
1166 he_dev->vcibits = CONFIG_DEFAULT_VCIBITS; in he_start()
1167 he_dev->vpibits = CONFIG_DEFAULT_VPIBITS; in he_start()
1169 if (nvpibits != -1 && nvcibits != -1 && nvpibits+nvcibits != HE_MAXCIDBITS) { in he_start()
1171 return -ENODEV; in he_start()
1174 if (nvpibits != -1) { in he_start()
1175 he_dev->vpibits = nvpibits; in he_start()
1176 he_dev->vcibits = HE_MAXCIDBITS - nvpibits; in he_start()
1179 if (nvcibits != -1) { in he_start()
1180 he_dev->vcibits = nvcibits; in he_start()
1181 he_dev->vpibits = HE_MAXCIDBITS - nvcibits; in he_start()
1186 he_dev->cells_per_row = 40; in he_start()
1187 he_dev->bytes_per_row = 2048; in he_start()
1188 he_dev->r0_numrows = 256; in he_start()
1189 he_dev->tx_numrows = 512; in he_start()
1190 he_dev->r1_numrows = 256; in he_start()
1191 he_dev->r0_startrow = 0; in he_start()
1192 he_dev->tx_startrow = 256; in he_start()
1193 he_dev->r1_startrow = 768; in he_start()
1195 he_dev->cells_per_row = 20; in he_start()
1196 he_dev->bytes_per_row = 1024; in he_start()
1197 he_dev->r0_numrows = 512; in he_start()
1198 he_dev->tx_numrows = 1018; in he_start()
1199 he_dev->r1_numrows = 512; in he_start()
1200 he_dev->r0_startrow = 6; in he_start()
1201 he_dev->tx_startrow = 518; in he_start()
1202 he_dev->r1_startrow = 1536; in he_start()
1205 he_dev->cells_per_lbuf = 4; in he_start()
1206 he_dev->buffer_limit = 4; in he_start()
1207 he_dev->r0_numbuffs = he_dev->r0_numrows * in he_start()
1208 he_dev->cells_per_row / he_dev->cells_per_lbuf; in he_start()
1209 if (he_dev->r0_numbuffs > 2560) in he_start()
1210 he_dev->r0_numbuffs = 2560; in he_start()
1212 he_dev->r1_numbuffs = he_dev->r1_numrows * in he_start()
1213 he_dev->cells_per_row / he_dev->cells_per_lbuf; in he_start()
1214 if (he_dev->r1_numbuffs > 2560) in he_start()
1215 he_dev->r1_numbuffs = 2560; in he_start()
1217 he_dev->tx_numbuffs = he_dev->tx_numrows * in he_start()
1218 he_dev->cells_per_row / he_dev->cells_per_lbuf; in he_start()
1219 if (he_dev->tx_numbuffs > 5120) in he_start()
1220 he_dev->tx_numbuffs = 5120; in he_start()
1242 he_writel(he_dev, he_dev->cells_per_lbuf * ATM_CELL_PAYLOAD, LB_CONFIG); in he_start()
1247 RX_VALVP(he_dev->vpibits) | in he_start()
1248 RX_VALVC(he_dev->vcibits), RC_CONFIG); in he_start()
1252 TX_VCI_MASK(he_dev->vcibits) | in he_start()
1253 LBFREE_CNT(he_dev->tx_numbuffs), TX_CONFIG); in he_start()
1258 (he_is622(he_dev) ? PTMR_PRE(67 - 1) : PTMR_PRE(50 - 1)), in he_start()
1420 return -ENOMEM; in he_start()
1426 he_dev->tpd_pool = dma_pool_create("tpd", &he_dev->pci_dev->dev, in he_start()
1428 if (he_dev->tpd_pool == NULL) { in he_start()
1430 return -ENOMEM; in he_start()
1433 INIT_LIST_HEAD(&he_dev->outstanding_tpds); in he_start()
1436 return -ENOMEM; in he_start()
1466 he_dev->hsp = dma_alloc_coherent(&he_dev->pci_dev->dev, in he_start()
1468 &he_dev->hsp_phys, GFP_KERNEL); in he_start()
1469 if (he_dev->hsp == NULL) { in he_start()
1471 return -ENOMEM; in he_start()
1473 he_writel(he_dev, he_dev->hsp_phys, HSP_BA); in he_start()
1479 suni_init(he_dev->atm_dev); in he_start()
1480 if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->start) in he_start()
1481 he_dev->atm_dev->phy->start(he_dev->atm_dev); in he_start()
1488 val = he_phy_get(he_dev->atm_dev, SUNI_TPOP_APM); in he_start()
1490 he_phy_put(he_dev->atm_dev, val, SUNI_TPOP_APM); in he_start()
1491 he_phy_put(he_dev->atm_dev, SUNI_TACP_IUCHP_CLP, SUNI_TACP_IUCHP); in he_start()
1505 he_dev->cs_stper[i].inuse = 0; in he_start()
1506 he_dev->cs_stper[i].pcr = -1; in he_start()
1508 he_dev->total_bw = 0; in he_start()
1513 he_dev->atm_dev->ci_range.vpi_bits = he_dev->vpibits; in he_start()
1514 he_dev->atm_dev->ci_range.vci_bits = he_dev->vcibits; in he_start()
1516 he_dev->irq_peak = 0; in he_start()
1517 he_dev->rbrq_peak = 0; in he_start()
1518 he_dev->rbpl_peak = 0; in he_start()
1519 he_dev->tbrq_peak = 0; in he_start()
1534 pci_dev = he_dev->pci_dev; in he_stop()
1538 if (he_dev->membase) { in he_stop()
1543 tasklet_disable(&he_dev->tasklet); in he_stop()
1557 if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->stop) in he_stop()
1558 he_dev->atm_dev->phy->stop(he_dev->atm_dev); in he_stop()
1561 if (he_dev->irq) in he_stop()
1562 free_irq(he_dev->irq, he_dev); in he_stop()
1564 if (he_dev->irq_base) in he_stop()
1565 dma_free_coherent(&he_dev->pci_dev->dev, (CONFIG_IRQ_SIZE + 1) in he_stop()
1566 * sizeof(struct he_irq), he_dev->irq_base, he_dev->irq_phys); in he_stop()
1568 if (he_dev->hsp) in he_stop()
1569 dma_free_coherent(&he_dev->pci_dev->dev, sizeof(struct he_hsp), in he_stop()
1570 he_dev->hsp, he_dev->hsp_phys); in he_stop()
1572 if (he_dev->rbpl_base) { in he_stop()
1573 list_for_each_entry_safe(heb, next, &he_dev->rbpl_outstanding, entry) in he_stop()
1574 dma_pool_free(he_dev->rbpl_pool, heb, heb->mapping); in he_stop()
1576 dma_free_coherent(&he_dev->pci_dev->dev, CONFIG_RBPL_SIZE in he_stop()
1577 * sizeof(struct he_rbp), he_dev->rbpl_base, he_dev->rbpl_phys); in he_stop()
1580 kfree(he_dev->rbpl_virt); in he_stop()
1581 kfree(he_dev->rbpl_table); in he_stop()
1582 dma_pool_destroy(he_dev->rbpl_pool); in he_stop()
1584 if (he_dev->rbrq_base) in he_stop()
1585 dma_free_coherent(&he_dev->pci_dev->dev, CONFIG_RBRQ_SIZE * sizeof(struct he_rbrq), in he_stop()
1586 he_dev->rbrq_base, he_dev->rbrq_phys); in he_stop()
1588 if (he_dev->tbrq_base) in he_stop()
1589 dma_free_coherent(&he_dev->pci_dev->dev, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq), in he_stop()
1590 he_dev->tbrq_base, he_dev->tbrq_phys); in he_stop()
1592 if (he_dev->tpdrq_base) in he_stop()
1593 dma_free_coherent(&he_dev->pci_dev->dev, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq), in he_stop()
1594 he_dev->tpdrq_base, he_dev->tpdrq_phys); in he_stop()
1596 dma_pool_destroy(he_dev->tpd_pool); in he_stop()
1598 if (he_dev->pci_dev) { in he_stop()
1599 pci_read_config_word(he_dev->pci_dev, PCI_COMMAND, &command); in he_stop()
1601 pci_write_config_word(he_dev->pci_dev, PCI_COMMAND, command); in he_stop()
1604 if (he_dev->membase) in he_stop()
1605 iounmap(he_dev->membase); in he_stop()
1614 tpd = dma_pool_alloc(he_dev->tpd_pool, GFP_ATOMIC, &mapping); in __alloc_tpd()
1618 tpd->status = TPD_ADDR(mapping); in __alloc_tpd()
1619 tpd->reserved = 0; in __alloc_tpd()
1620 tpd->iovec[0].addr = 0; tpd->iovec[0].len = 0; in __alloc_tpd()
1621 tpd->iovec[1].addr = 0; tpd->iovec[1].len = 0; in __alloc_tpd()
1622 tpd->iovec[2].addr = 0; tpd->iovec[2].len = 0; in __alloc_tpd()
1628 ((((unsigned char *)(buf))[(len)-6] << 8) | \
1629 (((unsigned char *)(buf))[(len)-5]))
1638 ((((unsigned char *)(buf))[(len)-2] << 8) | \
1639 (((unsigned char *)(buf))[(len-1)]))
1645 ((unsigned long)he_dev->rbrq_base | in he_service_rbrq()
1646 he_dev->hsp->group[group].rbrq_tail); in he_service_rbrq()
1647 unsigned cid, lastcid = -1; in he_service_rbrq()
1649 struct atm_vcc *vcc = NULL; in he_service_rbrq() local
1657 while (he_dev->rbrq_head != rbrq_tail) { in he_service_rbrq()
1660 HPRINTK("%p rbrq%d 0x%x len=%d cid=0x%x %s%s%s%s%s%s\n", in he_service_rbrq()
1661 he_dev->rbrq_head, group, in he_service_rbrq()
1662 RBRQ_ADDR(he_dev->rbrq_head), in he_service_rbrq()
1663 RBRQ_BUFLEN(he_dev->rbrq_head), in he_service_rbrq()
1664 RBRQ_CID(he_dev->rbrq_head), in he_service_rbrq()
1665 RBRQ_CRC_ERR(he_dev->rbrq_head) ? " CRC_ERR" : "", in he_service_rbrq()
1666 RBRQ_LEN_ERR(he_dev->rbrq_head) ? " LEN_ERR" : "", in he_service_rbrq()
1667 RBRQ_END_PDU(he_dev->rbrq_head) ? " END_PDU" : "", in he_service_rbrq()
1668 RBRQ_AAL5_PROT(he_dev->rbrq_head) ? " AAL5_PROT" : "", in he_service_rbrq()
1669 RBRQ_CON_CLOSED(he_dev->rbrq_head) ? " CON_CLOSED" : "", in he_service_rbrq()
1670 RBRQ_HBUF_ERR(he_dev->rbrq_head) ? " HBUF_ERR" : ""); in he_service_rbrq()
1672 i = RBRQ_ADDR(he_dev->rbrq_head) >> RBP_IDX_OFFSET; in he_service_rbrq()
1673 heb = he_dev->rbpl_virt[i]; in he_service_rbrq()
1675 cid = RBRQ_CID(he_dev->rbrq_head); in he_service_rbrq()
1677 vcc = __find_vcc(he_dev, cid); in he_service_rbrq()
1680 if (vcc == NULL || (he_vcc = HE_VCC(vcc)) == NULL) { in he_service_rbrq()
1681 hprintk("vcc/he_vcc == NULL (cid 0x%x)\n", cid); in he_service_rbrq()
1682 if (!RBRQ_HBUF_ERR(he_dev->rbrq_head)) { in he_service_rbrq()
1683 clear_bit(i, he_dev->rbpl_table); in he_service_rbrq()
1684 list_del(&heb->entry); in he_service_rbrq()
1685 dma_pool_free(he_dev->rbpl_pool, heb, heb->mapping); in he_service_rbrq()
1691 if (RBRQ_HBUF_ERR(he_dev->rbrq_head)) { in he_service_rbrq()
1693 atomic_inc(&vcc->stats->rx_drop); in he_service_rbrq()
1697 heb->len = RBRQ_BUFLEN(he_dev->rbrq_head) * 4; in he_service_rbrq()
1698 clear_bit(i, he_dev->rbpl_table); in he_service_rbrq()
1699 list_move_tail(&heb->entry, &he_vcc->buffers); in he_service_rbrq()
1700 he_vcc->pdu_len += heb->len; in he_service_rbrq()
1702 if (RBRQ_CON_CLOSED(he_dev->rbrq_head)) { in he_service_rbrq()
1703 lastcid = -1; in he_service_rbrq()
1705 wake_up(&he_vcc->rx_waitq); in he_service_rbrq()
1709 if (!RBRQ_END_PDU(he_dev->rbrq_head)) in he_service_rbrq()
1712 if (RBRQ_LEN_ERR(he_dev->rbrq_head) in he_service_rbrq()
1713 || RBRQ_CRC_ERR(he_dev->rbrq_head)) { in he_service_rbrq()
1715 RBRQ_CRC_ERR(he_dev->rbrq_head) in he_service_rbrq()
1717 RBRQ_LEN_ERR(he_dev->rbrq_head) in he_service_rbrq()
1719 vcc->vpi, vcc->vci); in he_service_rbrq()
1720 atomic_inc(&vcc->stats->rx_err); in he_service_rbrq()
1724 skb = atm_alloc_charge(vcc, he_vcc->pdu_len + rx_skb_reserve, in he_service_rbrq()
1727 HPRINTK("charge failed (%d.%d)\n", vcc->vpi, vcc->vci); in he_service_rbrq()
1736 list_for_each_entry(heb, &he_vcc->buffers, entry) in he_service_rbrq()
1737 skb_put_data(skb, &heb->data, heb->len); in he_service_rbrq()
1739 switch (vcc->qos.aal) { in he_service_rbrq()
1742 skb->len = ATM_AAL0_SDU; in he_service_rbrq()
1743 skb_set_tail_pointer(skb, skb->len); in he_service_rbrq()
1748 skb->len = AAL5_LEN(skb->data, he_vcc->pdu_len); in he_service_rbrq()
1749 skb_set_tail_pointer(skb, skb->len); in he_service_rbrq()
1751 if (vcc->vpi == 0 && vcc->vci >= ATM_NOT_RSV_VCI) { in he_service_rbrq()
1752 skb->ip_summed = CHECKSUM_COMPLETE; in he_service_rbrq()
1753 skb->csum = TCP_CKSUM(skb->data, in he_service_rbrq()
1754 he_vcc->pdu_len); in he_service_rbrq()
1761 if (skb->len > vcc->qos.rxtp.max_sdu) in he_service_rbrq()
1762 …hprintk("pdu_len (%d) > vcc->qos.rxtp.max_sdu (%d)! cid 0x%x\n", skb->len, vcc->qos.rxtp.max_sdu,… in he_service_rbrq()
1766 ATM_SKB(skb)->vcc = vcc; in he_service_rbrq()
1768 spin_unlock(&he_dev->global_lock); in he_service_rbrq()
1769 vcc->push(vcc, skb); in he_service_rbrq()
1770 spin_lock(&he_dev->global_lock); in he_service_rbrq()
1772 atomic_inc(&vcc->stats->rx); in he_service_rbrq()
1777 list_for_each_entry_safe(heb, next, &he_vcc->buffers, entry) in he_service_rbrq()
1778 dma_pool_free(he_dev->rbpl_pool, heb, heb->mapping); in he_service_rbrq()
1779 INIT_LIST_HEAD(&he_vcc->buffers); in he_service_rbrq()
1780 he_vcc->pdu_len = 0; in he_service_rbrq()
1783 he_dev->rbrq_head = (struct he_rbrq *) in he_service_rbrq()
1784 ((unsigned long) he_dev->rbrq_base | in he_service_rbrq()
1785 RBRQ_MASK(he_dev->rbrq_head + 1)); in he_service_rbrq()
1791 if (updated > he_dev->rbrq_peak) in he_service_rbrq()
1792 he_dev->rbrq_peak = updated; in he_service_rbrq()
1794 he_writel(he_dev, RBRQ_MASK(he_dev->rbrq_head), in he_service_rbrq()
1805 ((unsigned long)he_dev->tbrq_base | in he_service_tbrq()
1806 he_dev->hsp->group[group].tbrq_tail); in he_service_tbrq()
1813 while (he_dev->tbrq_head != tbrq_tail) { in he_service_tbrq()
1818 TBRQ_TPD(he_dev->tbrq_head), in he_service_tbrq()
1819 TBRQ_EOS(he_dev->tbrq_head) ? " EOS" : "", in he_service_tbrq()
1820 TBRQ_MULTIPLE(he_dev->tbrq_head) ? " MULTIPLE" : ""); in he_service_tbrq()
1822 list_for_each_entry(__tpd, &he_dev->outstanding_tpds, entry) { in he_service_tbrq()
1823 if (TPD_ADDR(__tpd->status) == TBRQ_TPD(he_dev->tbrq_head)) { in he_service_tbrq()
1825 list_del(&__tpd->entry); in he_service_tbrq()
1832 TBRQ_TPD(he_dev->tbrq_head)); in he_service_tbrq()
1836 if (TBRQ_EOS(he_dev->tbrq_head)) { in he_service_tbrq()
1838 he_mkcid(he_dev, tpd->vcc->vpi, tpd->vcc->vci)); in he_service_tbrq()
1839 if (tpd->vcc) in he_service_tbrq()
1840 wake_up(&HE_VCC(tpd->vcc)->tx_waitq); in he_service_tbrq()
1846 if (tpd->iovec[slot].addr) in he_service_tbrq()
1847 dma_unmap_single(&he_dev->pci_dev->dev, in he_service_tbrq()
1848 tpd->iovec[slot].addr, in he_service_tbrq()
1849 tpd->iovec[slot].len & TPD_LEN_MASK, in he_service_tbrq()
1851 if (tpd->iovec[slot].len & TPD_LST) in he_service_tbrq()
1856 if (tpd->skb) { /* && !TBRQ_MULTIPLE(he_dev->tbrq_head) */ in he_service_tbrq()
1857 if (tpd->vcc && tpd->vcc->pop) in he_service_tbrq()
1858 tpd->vcc->pop(tpd->vcc, tpd->skb); in he_service_tbrq()
1860 dev_kfree_skb_any(tpd->skb); in he_service_tbrq()
1865 dma_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status)); in he_service_tbrq()
1866 he_dev->tbrq_head = (struct he_tbrq *) in he_service_tbrq()
1867 ((unsigned long) he_dev->tbrq_base | in he_service_tbrq()
1868 TBRQ_MASK(he_dev->tbrq_head + 1)); in he_service_tbrq()
1872 if (updated > he_dev->tbrq_peak) in he_service_tbrq()
1873 he_dev->tbrq_peak = updated; in he_service_tbrq()
1875 he_writel(he_dev, TBRQ_MASK(he_dev->tbrq_head), in he_service_tbrq()
1890 rbpl_head = (struct he_rbp *) ((unsigned long)he_dev->rbpl_base | in he_service_rbpl()
1894 new_tail = (struct he_rbp *) ((unsigned long)he_dev->rbpl_base | in he_service_rbpl()
1895 RBPL_MASK(he_dev->rbpl_tail+1)); in he_service_rbpl()
1897 /* table 3.42 -- rbpl_tail should never be set to rbpl_head */ in he_service_rbpl()
1901 i = find_next_zero_bit(he_dev->rbpl_table, RBPL_TABLE_SIZE, he_dev->rbpl_hint); in he_service_rbpl()
1902 if (i > (RBPL_TABLE_SIZE - 1)) { in he_service_rbpl()
1903 i = find_first_zero_bit(he_dev->rbpl_table, RBPL_TABLE_SIZE); in he_service_rbpl()
1904 if (i > (RBPL_TABLE_SIZE - 1)) in he_service_rbpl()
1907 he_dev->rbpl_hint = i + 1; in he_service_rbpl()
1909 heb = dma_pool_alloc(he_dev->rbpl_pool, GFP_ATOMIC, &mapping); in he_service_rbpl()
1912 heb->mapping = mapping; in he_service_rbpl()
1913 list_add(&heb->entry, &he_dev->rbpl_outstanding); in he_service_rbpl()
1914 he_dev->rbpl_virt[i] = heb; in he_service_rbpl()
1915 set_bit(i, he_dev->rbpl_table); in he_service_rbpl()
1916 new_tail->idx = i << RBP_IDX_OFFSET; in he_service_rbpl()
1917 new_tail->phys = mapping + offsetof(struct he_buff, data); in he_service_rbpl()
1919 he_dev->rbpl_tail = new_tail; in he_service_rbpl()
1924 he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), G0_RBPL_T); in he_service_rbpl()
1936 spin_lock_irqsave(&he_dev->global_lock, flags); in he_tasklet()
1938 while (he_dev->irq_head != he_dev->irq_tail) { in he_tasklet()
1941 type = ITYPE_TYPE(he_dev->irq_head->isw); in he_tasklet()
1942 group = ITYPE_GROUP(he_dev->irq_head->isw); in he_tasklet()
1967 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_tasklet()
1968 if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->interrupt) in he_tasklet()
1969 he_dev->atm_dev->phy->interrupt(he_dev->atm_dev); in he_tasklet()
1970 spin_lock_irqsave(&he_dev->global_lock, flags); in he_tasklet()
1984 /* see 8.1.1 -- check all queues */ in he_tasklet()
1986 HPRINTK("isw not updated 0x%x\n", he_dev->irq_head->isw); in he_tasklet()
1993 hprintk("bad isw 0x%x?\n", he_dev->irq_head->isw); in he_tasklet()
1996 he_dev->irq_head->isw = ITYPE_INVALID; in he_tasklet()
1998 he_dev->irq_head = (struct he_irq *) NEXT_ENTRY(he_dev->irq_base, he_dev->irq_head, IRQ_MASK); in he_tasklet()
2002 if (updated > he_dev->irq_peak) in he_tasklet()
2003 he_dev->irq_peak = updated; in he_tasklet()
2008 IRQ_TAIL(he_dev->irq_tail), IRQ0_HEAD); in he_tasklet()
2011 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_tasklet()
2024 spin_lock_irqsave(&he_dev->global_lock, flags); in he_irq_handler()
2026 he_dev->irq_tail = (struct he_irq *) (((unsigned long)he_dev->irq_base) | in he_irq_handler()
2027 (*he_dev->irq_tailoffset << 2)); in he_irq_handler()
2029 if (he_dev->irq_tail == he_dev->irq_head) { in he_irq_handler()
2031 he_dev->irq_tail = (struct he_irq *) ((unsigned long)he_dev->irq_base | in he_irq_handler()
2037 if (he_dev->irq_head == he_dev->irq_tail /* && !IRQ_PENDING */) in he_irq_handler()
2041 if (he_dev->irq_head != he_dev->irq_tail) { in he_irq_handler()
2043 tasklet_schedule(&he_dev->tasklet); in he_irq_handler()
2047 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_irq_handler()
2057 HPRINTK("tpdrq %p cid 0x%x -> tpdrq_tail %p\n", in __enqueue_tpd()
2058 tpd, cid, he_dev->tpdrq_tail); in __enqueue_tpd()
2060 /* new_tail = he_dev->tpdrq_tail; */ in __enqueue_tpd()
2061 new_tail = (struct he_tpdrq *) ((unsigned long) he_dev->tpdrq_base | in __enqueue_tpd()
2062 TPDRQ_MASK(he_dev->tpdrq_tail+1)); in __enqueue_tpd()
2071 if (new_tail == he_dev->tpdrq_head) { in __enqueue_tpd()
2072 he_dev->tpdrq_head = (struct he_tpdrq *) in __enqueue_tpd()
2073 (((unsigned long)he_dev->tpdrq_base) | in __enqueue_tpd()
2076 if (new_tail == he_dev->tpdrq_head) { in __enqueue_tpd()
2087 if (tpd->iovec[slot].addr) in __enqueue_tpd()
2088 dma_unmap_single(&he_dev->pci_dev->dev, in __enqueue_tpd()
2089 tpd->iovec[slot].addr, in __enqueue_tpd()
2090 tpd->iovec[slot].len & TPD_LEN_MASK, in __enqueue_tpd()
2093 if (tpd->skb) { in __enqueue_tpd()
2094 if (tpd->vcc->pop) in __enqueue_tpd()
2095 tpd->vcc->pop(tpd->vcc, tpd->skb); in __enqueue_tpd()
2097 dev_kfree_skb_any(tpd->skb); in __enqueue_tpd()
2098 atomic_inc(&tpd->vcc->stats->tx_err); in __enqueue_tpd()
2100 dma_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status)); in __enqueue_tpd()
2106 list_add_tail(&tpd->entry, &he_dev->outstanding_tpds); in __enqueue_tpd()
2107 he_dev->tpdrq_tail->tpd = TPD_ADDR(tpd->status); in __enqueue_tpd()
2108 he_dev->tpdrq_tail->cid = cid; in __enqueue_tpd()
2111 he_dev->tpdrq_tail = new_tail; in __enqueue_tpd()
2113 he_writel(he_dev, TPDRQ_MASK(he_dev->tpdrq_tail), TPDRQ_T); in __enqueue_tpd()
2118 he_open(struct atm_vcc *vcc) in he_open() argument
2121 struct he_dev *he_dev = HE_DEV(vcc->dev); in he_open()
2125 short vpi = vcc->vpi; in he_open()
2126 int vci = vcc->vci; in he_open()
2131 HPRINTK("open vcc %p %d.%d\n", vcc, vpi, vci); in he_open()
2133 set_bit(ATM_VF_ADDR, &vcc->flags); in he_open()
2140 return -ENOMEM; in he_open()
2143 INIT_LIST_HEAD(&he_vcc->buffers); in he_open()
2144 he_vcc->pdu_len = 0; in he_open()
2145 he_vcc->rc_index = -1; in he_open()
2147 init_waitqueue_head(&he_vcc->rx_waitq); in he_open()
2148 init_waitqueue_head(&he_vcc->tx_waitq); in he_open()
2150 vcc->dev_data = he_vcc; in he_open()
2152 if (vcc->qos.txtp.traffic_class != ATM_NONE) { in he_open()
2155 pcr_goal = atm_pcr_goal(&vcc->qos.txtp); in he_open()
2157 pcr_goal = he_dev->atm_dev->link_rate; in he_open()
2159 pcr_goal = -pcr_goal; in he_open()
2163 switch (vcc->qos.aal) { in he_open()
2173 err = -EINVAL; in he_open()
2177 spin_lock_irqsave(&he_dev->global_lock, flags); in he_open()
2179 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_open()
2183 err = -EBUSY; in he_open()
2187 switch (vcc->qos.txtp.traffic_class) { in he_open()
2198 /* 8.2.3 cbr scheduler wrap problem -- limit to 90% total link rate */ in he_open()
2199 if ((he_dev->total_bw + pcr_goal) in he_open()
2200 > (he_dev->atm_dev->link_rate * 9 / 10)) in he_open()
2202 err = -EBUSY; in he_open()
2206 spin_lock_irqsave(&he_dev->global_lock, flags); /* also protects he_dev->cs_stper[] */ in he_open()
2210 if (he_dev->cs_stper[reg].inuse == 0 || in he_open()
2211 he_dev->cs_stper[reg].pcr == pcr_goal) in he_open()
2215 err = -EBUSY; in he_open()
2216 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_open()
2220 he_dev->total_bw += pcr_goal; in he_open()
2222 he_vcc->rc_index = reg; in he_open()
2223 ++he_dev->cs_stper[reg].inuse; in he_open()
2224 he_dev->cs_stper[reg].pcr = pcr_goal; in he_open()
2234 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_open()
2241 err = -EINVAL; in he_open()
2245 spin_lock_irqsave(&he_dev->global_lock, flags); in he_open()
2265 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_open()
2268 if (vcc->qos.rxtp.traffic_class != ATM_NONE) { in he_open()
2271 HPRINTK("open rx cid 0x%x (rx_waitq %p)\n", cid, in he_open()
2272 &HE_VCC(vcc)->rx_waitq); in he_open()
2274 switch (vcc->qos.aal) { in he_open()
2282 err = -EINVAL; in he_open()
2286 spin_lock_irqsave(&he_dev->global_lock, flags); in he_open()
2290 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_open()
2293 err = -EBUSY; in he_open()
2299 rsr0 = vcc->qos.rxtp.traffic_class == ATM_UBR ? in he_open()
2315 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_open()
2322 clear_bit(ATM_VF_ADDR, &vcc->flags); in he_open()
2325 set_bit(ATM_VF_READY, &vcc->flags); in he_open()
2331 he_close(struct atm_vcc *vcc) in he_close() argument
2335 struct he_dev *he_dev = HE_DEV(vcc->dev); in he_close()
2338 struct he_vcc *he_vcc = HE_VCC(vcc); in he_close()
2342 HPRINTK("close vcc %p %d.%d\n", vcc, vcc->vpi, vcc->vci); in he_close()
2344 clear_bit(ATM_VF_READY, &vcc->flags); in he_close()
2345 cid = he_mkcid(he_dev, vcc->vpi, vcc->vci); in he_close()
2347 if (vcc->qos.rxtp.traffic_class != ATM_NONE) { in he_close()
2356 spin_lock_irqsave(&he_dev->global_lock, flags); in he_close()
2363 add_wait_queue(&he_vcc->rx_waitq, &wait); in he_close()
2368 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_close()
2372 remove_wait_queue(&he_vcc->rx_waitq, &wait); in he_close()
2382 if (vcc->qos.txtp.traffic_class != ATM_NONE) { in he_close()
2397 while (((tx_inuse = refcount_read(&sk_atm(vcc)->sk_wmem_alloc)) > 1) && in he_close()
2411 spin_lock_irqsave(&he_dev->global_lock, flags); in he_close()
2415 switch (vcc->qos.txtp.traffic_class) { in he_close()
2432 tpd->status |= TPD_EOS | TPD_INT; in he_close()
2433 tpd->skb = NULL; in he_close()
2434 tpd->vcc = vcc; in he_close()
2438 add_wait_queue(&he_vcc->tx_waitq, &wait); in he_close()
2440 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_close()
2444 remove_wait_queue(&he_vcc->tx_waitq, &wait); in he_close()
2447 spin_lock_irqsave(&he_dev->global_lock, flags); in he_close()
2466 if (vcc->qos.txtp.traffic_class == ATM_CBR) { in he_close()
2467 int reg = he_vcc->rc_index; in he_close()
2471 if (he_dev->cs_stper[reg].inuse == 0) in he_close()
2474 --he_dev->cs_stper[reg].inuse; in he_close()
2476 he_dev->total_bw -= he_dev->cs_stper[reg].pcr; in he_close()
2478 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_close()
2485 clear_bit(ATM_VF_ADDR, &vcc->flags); in he_close()
2489 he_send(struct atm_vcc *vcc, struct sk_buff *skb) in he_send() argument
2492 struct he_dev *he_dev = HE_DEV(vcc->dev); in he_send()
2493 unsigned cid = he_mkcid(he_dev, vcc->vpi, vcc->vci); in he_send()
2501 HPRINTK("send %d.%d\n", vcc->vpi, vcc->vci); in he_send()
2503 if ((skb->len > HE_TPD_BUFSIZE) || in he_send()
2504 ((vcc->qos.aal == ATM_AAL0) && (skb->len != ATM_AAL0_SDU))) { in he_send()
2505 hprintk("buffer too large (or small) -- %d bytes\n", skb->len ); in he_send()
2506 if (vcc->pop) in he_send()
2507 vcc->pop(vcc, skb); in he_send()
2510 atomic_inc(&vcc->stats->tx_err); in he_send()
2511 return -EINVAL; in he_send()
2515 if (skb_shinfo(skb)->nr_frags) { in he_send()
2517 if (vcc->pop) in he_send()
2518 vcc->pop(vcc, skb); in he_send()
2521 atomic_inc(&vcc->stats->tx_err); in he_send()
2522 return -EINVAL; in he_send()
2525 spin_lock_irqsave(&he_dev->global_lock, flags); in he_send()
2529 if (vcc->pop) in he_send()
2530 vcc->pop(vcc, skb); in he_send()
2533 atomic_inc(&vcc->stats->tx_err); in he_send()
2534 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_send()
2535 return -ENOMEM; in he_send()
2538 if (vcc->qos.aal == ATM_AAL5) in he_send()
2539 tpd->status |= TPD_CELLTYPE(TPD_USERCELL); in he_send()
2541 char *pti_clp = (void *) (skb->data + 3); in he_send()
2546 tpd->status |= TPD_CELLTYPE(pti); in he_send()
2548 tpd->status |= TPD_CLP; in he_send()
2550 skb_pull(skb, ATM_AAL0_SDU - ATM_CELL_PAYLOAD); in he_send()
2554 tpd->iovec[slot].addr = dma_map_single(&he_dev->pci_dev->dev, skb->data, in he_send()
2556 tpd->iovec[slot].len = skb_headlen(skb); in he_send()
2559 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { in he_send()
2560 skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; in he_send()
2563 tpd->vcc = vcc; in he_send()
2564 tpd->skb = NULL; /* not the last fragment in he_send()
2565 so dont ->push() yet */ in he_send()
2571 if (vcc->pop) in he_send()
2572 vcc->pop(vcc, skb); in he_send()
2575 atomic_inc(&vcc->stats->tx_err); in he_send()
2576 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_send()
2577 return -ENOMEM; in he_send()
2579 tpd->status |= TPD_USERCELL; in he_send()
2583 tpd->iovec[slot].addr = skb_frag_dma_map(&he_dev->pci_dev->dev, in he_send()
2585 tpd->iovec[slot].len = skb_frag_size(frag); in he_send()
2590 tpd->iovec[slot - 1].len |= TPD_LST; in he_send()
2592 tpd->address0 = dma_map_single(&he_dev->pci_dev->dev, skb->data, skb->len, DMA_TO_DEVICE); in he_send()
2593 tpd->length0 = skb->len | TPD_LST; in he_send()
2595 tpd->status |= TPD_INT; in he_send()
2597 tpd->vcc = vcc; in he_send()
2598 tpd->skb = skb; in he_send()
2600 ATM_SKB(skb)->vcc = vcc; in he_send()
2603 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_send()
2605 atomic_inc(&vcc->stats->tx); in he_send()
2621 return -EPERM; in he_ioctl()
2625 return -EFAULT; in he_ioctl()
2627 spin_lock_irqsave(&he_dev->global_lock, flags); in he_ioctl()
2631 err = -EINVAL; in he_ioctl()
2650 err = -EINVAL; in he_ioctl()
2653 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_ioctl()
2657 return -EFAULT; in he_ioctl()
2661 if (atm_dev->phy && atm_dev->phy->ioctl) in he_ioctl()
2662 err = atm_dev->phy->ioctl(atm_dev, cmd, arg); in he_ioctl()
2664 err = -EINVAL; in he_ioctl()
2680 spin_lock_irqsave(&he_dev->global_lock, flags); in he_phy_put()
2683 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_phy_put()
2694 spin_lock_irqsave(&he_dev->global_lock, flags); in he_phy_get()
2696 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_phy_get()
2717 if (!left--) in he_proc_read()
2720 if (!left--) in he_proc_read()
2722 he_dev->prod_id, he_dev->media & 0x40 ? "SM" : "MM"); in he_proc_read()
2724 if (!left--) in he_proc_read()
2727 spin_lock_irqsave(&he_dev->global_lock, flags); in he_proc_read()
2732 spin_unlock_irqrestore(&he_dev->global_lock, flags); in he_proc_read()
2734 if (!left--) in he_proc_read()
2738 if (!left--) in he_proc_read()
2740 CONFIG_IRQ_SIZE, he_dev->irq_peak); in he_proc_read()
2742 if (!left--) in he_proc_read()
2746 if (!left--) in he_proc_read()
2748 CONFIG_RBRQ_SIZE, he_dev->rbrq_peak); in he_proc_read()
2750 if (!left--) in he_proc_read()
2752 CONFIG_TBRQ_SIZE, he_dev->tbrq_peak); in he_proc_read()
2759 inuse = rbpl_head - rbpl_tail; in he_proc_read()
2764 if (!left--) in he_proc_read()
2769 if (!left--) in he_proc_read()
2773 if (!left--) in he_proc_read()
2774 return sprintf(page, "cs_stper%-2d %8ld %3d\n", i, in he_proc_read()
2775 he_dev->cs_stper[i].pcr, in he_proc_read()
2776 he_dev->cs_stper[i].inuse); in he_proc_read()
2778 if (!left--) in he_proc_read()
2780 he_dev->total_bw, he_dev->atm_dev->link_rate * 10 / 9); in he_proc_read()
2785 /* eeprom routines -- see 4.7 */
2793 val = readl(he_dev->membase + HOST_CNTL); in read_prom_byte()
2807 for (i = 7; i >= 0; i--) { in read_prom_byte()
2820 for (i = 7; i >= 0; i--) { in read_prom_byte()
2840 MODULE_PARM_DESC(disable64, "disable 64-bit pci bus transfers");