Lines Matching +full:foo +full:- +full:queue

1 // SPDX-License-Identifier: GPL-2.0-only
2 /* drivers/atm/eni.c - Efficient Networks ENI155P device driver */
4 /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
41 * - OAM support
42 * - fix bugs listed below
48 * - may run into JK-JK bug and deadlock
49 * - should allocate UBR channel first
50 * - buffer space allocation algorithm is stupid
53 * - doesn't support OAM cells
54 * - eni_put_free may hang if not putting memory fragments that _complete_
143 #define NEPMOK(a0,d,b,c) NEPJOK(a0,(a0+d) & (c-1),b)
144 #define EEPMOK(a0,d,b,c) EEPJOK(a0,(a0+d) & (c-1),b)
154 #define eni_in(r) readl(eni_dev->reg+(r)*4)
155 #define eni_out(v,r) writel((v),eni_dev->reg+(r)*4)
158 /*-------------------------------- utilities --------------------------------*/
165 for (i = 0; i < eni_dev->free_len; i++) in dump_mem()
167 eni_dev->free_list[i].start, in dump_mem()
168 1 << eni_dev->free_list[i].order); in dump_mem()
183 if (eni_dev->tx[i].send) in dump()
185 eni_dev->tx[i].send,eni_dev->tx[i].words*4); in dump()
188 if (eni_dev->rx_map[i] && ENI_VCC(eni_dev->rx_map[i])->rx) in dump()
190 ENI_VCC(eni_dev->rx_map[i])->recv, in dump()
191 ENI_VCC(eni_dev->rx_map[i])->words*4); in dump()
192 printk(KERN_NOTICE "----\n"); in dump()
203 start += eni_dev->base_diff; in eni_put_free()
204 list = eni_dev->free_list; in eni_put_free()
205 len = eni_dev->free_len; in eni_put_free()
207 if (len >= eni_dev->free_list_size) { in eni_put_free()
222 size -= 1 << order; in eni_put_free()
224 eni_dev->free_len = len; in eni_put_free()
235 list = eni_dev->free_list; in eni_alloc_mem()
236 len = eni_dev->free_len; in eni_alloc_mem()
241 DPRINTK("trying: %ld->%d\n",*size,order); in eni_alloc_mem()
255 start = list[index].start-eni_dev->base_diff; in eni_alloc_mem()
256 list[index] = list[--len]; in eni_alloc_mem()
257 eni_dev->free_len = len; in eni_alloc_mem()
259 eni_put_free(eni_dev,start+*size,(1 << best_order)-*size); in eni_alloc_mem()
273 start += eni_dev->base_diff; in eni_free_mem()
274 list = eni_dev->free_list; in eni_free_mem()
275 len = eni_dev->free_len; in eni_free_mem()
276 for (order = -1; size; order++) size >>= 1; in eni_free_mem()
283 list[i] = list[--len]; in eni_free_mem()
286 i = -1; in eni_free_mem()
289 if (len >= eni_dev->free_list_size) { in eni_free_mem()
296 eni_dev->free_len = len+1; in eni_free_mem()
301 /*----------------------------------- RX ------------------------------------*/
313 dev = vcc->dev; in rx_ident_err()
320 printk(KERN_ALERT DEV_LABEL "(itf %d): driver error - RX ident " in rx_ident_err()
321 "mismatch\n",dev->number); in rx_ident_err()
322 printk(KERN_ALERT " VCI %d, rxing %d, words %ld\n",vcc->vci, in rx_ident_err()
323 eni_vcc->rxing,eni_vcc->words); in rx_ident_err()
325 "0x%x\n",eni_vcc->descr,eni_vcc->rx_pos, in rx_ident_err()
326 (unsigned) readl(eni_vcc->recv+eni_vcc->descr*4)); in rx_ident_err()
327 printk(KERN_ALERT " last %p, servicing %d\n",eni_vcc->last, in rx_ident_err()
328 eni_vcc->servicing); in rx_ident_err()
329 EVENT("---dump ends here---\n",0,0); in rx_ident_err()
330 printk(KERN_NOTICE "---recent events---\n"); in rx_ident_err()
332 ENI_DEV(dev)->fast = NULL; /* really stop it */ in rx_ident_err()
333 ENI_DEV(dev)->slow = NULL; in rx_ident_err()
334 skb_queue_head_init(&ENI_DEV(dev)->rx_queue); in rx_ident_err()
349 eni_dev = ENI_DEV(vcc->dev); in do_rx_dma()
353 paddr = dma_map_single(&eni_dev->pci_dev->dev,skb->data,skb->len, in do_rx_dma()
355 if (dma_mapping_error(&eni_dev->pci_dev->dev, paddr)) in do_rx_dma()
360 "mis-aligned RX data (0x%lx)\n",vcc->dev->number, in do_rx_dma()
361 vcc->vci,(unsigned long) paddr); in do_rx_dma()
364 ATM_SKB(skb)->vcc = vcc; in do_rx_dma()
368 here = (eni_vcc->descr+skip) & (eni_vcc->words-1); in do_rx_dma()
369 dma[j++] = (here << MID_DMA_COUNT_SHIFT) | (vcc->vci in do_rx_dma()
373 here = (eni_vcc->descr+size+skip) & (eni_vcc->words-1); in do_rx_dma()
387 init = 4-((paddr & 15) >> 2); in do_rx_dma()
390 (vcc->vci << MID_DMA_VCI_SHIFT); in do_rx_dma()
393 words -= init; in do_rx_dma()
398 MID_DMA_COUNT_SHIFT) | (vcc->vci << in do_rx_dma()
408 MID_DMA_COUNT_SHIFT) | (vcc->vci << in do_rx_dma()
418 MID_DMA_COUNT_SHIFT) | (vcc->vci << in do_rx_dma()
428 MID_DMA_COUNT_SHIFT) | (vcc->vci << in do_rx_dma()
437 | (vcc->vci << MID_DMA_VCI_SHIFT); in do_rx_dma()
443 (vcc->vci << MID_DMA_VCI_SHIFT) | MID_DT_JK; in do_rx_dma()
450 dma[j-2] |= MID_DMA_END; in do_rx_dma()
460 vcc->dev->number); in do_rx_dma()
464 writel(dma[i*2],eni_dev->rx_dma+dma_wr*8); in do_rx_dma()
465 writel(dma[i*2+1],eni_dev->rx_dma+dma_wr*8+4); in do_rx_dma()
466 dma_wr = (dma_wr+1) & (NR_DMA_RX-1); in do_rx_dma()
469 ENI_PRV_POS(skb) = eni_vcc->descr+size+1; in do_rx_dma()
470 skb_queue_tail(&eni_dev->rx_queue,skb); in do_rx_dma()
471 eni_vcc->last = skb; in do_rx_dma()
474 eni_vcc->descr = here; in do_rx_dma()
480 dma_unmap_single(&eni_dev->pci_dev->dev,paddr,skb->len, in do_rx_dma()
484 return -1; in do_rx_dma()
496 if (eni_vcc->rxing) ENI_PRV_POS(eni_vcc->last) += size+1; in discard()
497 else eni_vcc->rx_pos = (eni_vcc->rx_pos+size+1) & (eni_vcc->words-1); in discard()
515 descr = readl(eni_vcc->recv+eni_vcc->descr*4); in rx_aal0()
522 vcc->dev->number); in rx_aal0()
524 atomic_inc(&vcc->stats->rx_err); in rx_aal0()
527 length = ATM_CELL_SIZE-1; /* no HEC */ in rx_aal0()
535 skb->tstamp = eni_vcc->timestamp; in rx_aal0()
538 eni_vcc->rxing++; in rx_aal0()
553 descr = readl(eni_vcc->recv+eni_vcc->descr*4); in rx_aal5()
562 vcc->dev->number); in rx_aal5()
571 vcc->dev->number); in rx_aal5()
579 atomic_inc(&vcc->stats->rx_err); in rx_aal5()
584 length = readl(eni_vcc->recv+(((eni_vcc->descr+size-1) & in rx_aal5()
585 (eni_vcc->words-1)))*4) & 0xffff; in rx_aal5()
586 /* -trailer(2)+header(1) */ in rx_aal5()
587 if (length && length <= (size << 2)-8 && length <= in rx_aal5()
594 vcc->dev->number,vcc->vci,length,size << 2,descr); in rx_aal5()
596 atomic_inc(&vcc->stats->rx_err); in rx_aal5()
607 eni_vcc->rxing++; in rx_aal5()
619 vci_dsc = ENI_DEV(vcc->dev)->vci+vcc->vci*16; in rx_vcc()
621 while (eni_vcc->descr != (tmp = (readl(vci_dsc+4) & MID_VCI_DESCR) >> in rx_vcc()
624 eni_vcc->descr,tmp); in rx_vcc()
625 DPRINTK("CB_DESCR %ld REG_DESCR %d\n",ENI_VCC(vcc)->descr, in rx_vcc()
628 if (ENI_VCC(vcc)->rx(vcc)) return 1; in rx_vcc()
638 while (ENI_VCC(vcc)->descr != (tmp = (readl(vci_dsc+4) & MID_VCI_DESCR) in rx_vcc()
641 eni_vcc->descr,tmp); in rx_vcc()
642 DPRINTK("CB_DESCR %ld REG_DESCR %d\n",ENI_VCC(vcc)->descr, in rx_vcc()
645 if (ENI_VCC(vcc)->rx(vcc)) return 1; in rx_vcc()
657 while ((curr = eni_dev->fast)) { in poll_rx()
660 eni_dev->fast = ENI_VCC(curr)->next; in poll_rx()
661 ENI_VCC(curr)->next = ENI_VCC_NOS; in poll_rx()
663 ENI_VCC(curr)->servicing--; in poll_rx()
665 while ((curr = eni_dev->slow)) { in poll_rx()
668 eni_dev->slow = ENI_VCC(curr)->next; in poll_rx()
669 ENI_VCC(curr)->next = ENI_VCC_NOS; in poll_rx()
671 ENI_VCC(curr)->servicing--; in poll_rx()
684 while (eni_in(MID_SERV_WRITE) != eni_dev->serv_read) { in get_service()
685 vci = readl(eni_dev->service+eni_dev->serv_read*4); in get_service()
686 eni_dev->serv_read = (eni_dev->serv_read+1) & (NR_SERVICE-1); in get_service()
687 vcc = eni_dev->rx_map[vci & 1023]; in get_service()
690 "found\n",dev->number,vci); in get_service()
695 if (ENI_VCC(vcc)->next != ENI_VCC_NOS) { in get_service()
700 ENI_VCC(vcc)->timestamp = ktime_get_real(); in get_service()
701 ENI_VCC(vcc)->next = NULL; in get_service()
702 if (vcc->qos.rxtp.traffic_class == ATM_CBR) { in get_service()
703 if (eni_dev->fast) in get_service()
704 ENI_VCC(eni_dev->last_fast)->next = vcc; in get_service()
705 else eni_dev->fast = vcc; in get_service()
706 eni_dev->last_fast = vcc; in get_service()
709 if (eni_dev->slow) in get_service()
710 ENI_VCC(eni_dev->last_slow)->next = vcc; in get_service()
711 else eni_dev->slow = vcc; in get_service()
712 eni_dev->last_slow = vcc; in get_service()
715 ENI_VCC(vcc)->servicing++; in get_service()
732 skb = skb_dequeue(&eni_dev->rx_queue); in dequeue_rx()
736 "rxing\n",dev->number); in dequeue_rx()
744 vcc = ATM_SKB(skb)->vcc; in dequeue_rx()
747 vci_dsc = eni_dev->vci+vcc->vci*16; in dequeue_rx()
748 if (!EEPMOK(eni_vcc->rx_pos,ENI_PRV_SIZE(skb), in dequeue_rx()
750 eni_vcc->words)) { in dequeue_rx()
752 skb_queue_head(&eni_dev->rx_queue,skb); in dequeue_rx()
755 eni_vcc->rxing--; in dequeue_rx()
756 eni_vcc->rx_pos = ENI_PRV_POS(skb) & (eni_vcc->words-1); in dequeue_rx()
757 dma_unmap_single(&eni_dev->pci_dev->dev,ENI_PRV_PADDR(skb),skb->len, in dequeue_rx()
759 if (!skb->len) dev_kfree_skb_irq(skb); in dequeue_rx()
761 EVENT("pushing (len=%ld)\n",skb->len,0); in dequeue_rx()
762 if (vcc->qos.aal == ATM_AAL0) in dequeue_rx()
763 *(unsigned long *) skb->data = in dequeue_rx()
764 ntohl(*(unsigned long *) skb->data); in dequeue_rx()
765 memset(skb->cb,0,sizeof(struct eni_skb_prv)); in dequeue_rx()
766 vcc->push(vcc,skb); in dequeue_rx()
769 atomic_inc(&vcc->stats->rx); in dequeue_rx()
771 wake_up(&eni_dev->rx_wait); in dequeue_rx()
782 eni_dev = ENI_DEV(vcc->dev); in open_rx_first()
784 eni_vcc->rx = NULL; in open_rx_first()
785 if (vcc->qos.rxtp.traffic_class == ATM_NONE) return 0; in open_rx_first()
786 size = vcc->qos.rxtp.max_sdu*eni_dev->rx_mult/100; in open_rx_first()
787 if (size > MID_MAX_BUF_SIZE && vcc->qos.rxtp.max_sdu <= in open_rx_first()
790 eni_vcc->recv = eni_alloc_mem(eni_dev,&size); in open_rx_first()
791 DPRINTK("rx at 0x%lx\n",eni_vcc->recv); in open_rx_first()
792 eni_vcc->words = size >> 2; in open_rx_first()
793 if (!eni_vcc->recv) return -ENOBUFS; in open_rx_first()
794 eni_vcc->rx = vcc->qos.aal == ATM_AAL5 ? rx_aal5 : rx_aal0; in open_rx_first()
795 eni_vcc->descr = 0; in open_rx_first()
796 eni_vcc->rx_pos = 0; in open_rx_first()
797 eni_vcc->rxing = 0; in open_rx_first()
798 eni_vcc->servicing = 0; in open_rx_first()
799 eni_vcc->next = ENI_VCC_NOS; in open_rx_first()
813 eni_dev = ENI_DEV(vcc->dev); in open_rx_second()
815 if (!eni_vcc->rx) return 0; in open_rx_second()
817 here = eni_dev->vci+vcc->vci*16; in open_rx_second()
818 DPRINTK("loc 0x%x\n",(unsigned) (eni_vcc->recv-eni_dev->ram)/4); in open_rx_second()
819 size = eni_vcc->words >> 8; in open_rx_second()
820 for (order = -1; size; order++) size >>= 1; in open_rx_second()
823 if (eni_dev->rx_map[vcc->vci]) in open_rx_second()
824 printk(KERN_CRIT DEV_LABEL "(itf %d): BUG - VCI %d already " in open_rx_second()
825 "in use\n",vcc->dev->number,vcc->vci); in open_rx_second()
826 eni_dev->rx_map[vcc->vci] = vcc; /* now it counts */ in open_rx_second()
827 writel(((vcc->qos.aal != ATM_AAL5 ? MID_MODE_RAW : MID_MODE_AAL5) << in open_rx_second()
829 (((eni_vcc->recv-eni_dev->ram) >> (MID_LOC_SKIP+2)) << in open_rx_second()
843 if (!eni_vcc->rx) return; in close_rx()
844 eni_dev = ENI_DEV(vcc->dev); in close_rx()
845 if (vcc->vpi != ATM_VPI_UNSPEC && vcc->vci != ATM_VCI_UNSPEC) { in close_rx()
846 here = eni_dev->vci+vcc->vci*16; in close_rx()
855 eni_dev->rx_map[vcc->vci] = NULL; in close_rx()
856 /* wait for RX queue to drain */ in close_rx()
859 add_wait_queue(&eni_dev->rx_wait,&wait); in close_rx()
863 /* transition service->rx: rxing++, servicing-- */ in close_rx()
864 if (!eni_vcc->servicing) { in close_rx()
866 if (!eni_vcc->rxing) break; in close_rx()
868 EVENT("drain PDUs (rx %ld, serv %ld)\n",eni_vcc->rxing, in close_rx()
869 eni_vcc->servicing); in close_rx()
870 printk(KERN_INFO "%d+%d RX left\n",eni_vcc->servicing, in close_rx()
871 eni_vcc->rxing); in close_rx()
879 tasklet_disable(&eni_dev->task); in close_rx()
880 tmp = readl(eni_dev->vci+vcc->vci*16+4) & MID_VCI_READ; in close_rx()
881 at_end = eni_vcc->rx_pos == tmp >> MID_VCI_READ_SHIFT; in close_rx()
882 tasklet_enable(&eni_dev->task); in close_rx()
885 eni_vcc->rx_pos,tmp); in close_rx()
887 eni_vcc->rx_pos,tmp); in close_rx()
892 remove_wait_queue(&eni_dev->rx_wait,&wait); in close_rx()
894 eni_free_mem(eni_dev,eni_vcc->recv,eni_vcc->words << 2); in close_rx()
895 eni_vcc->rx = NULL; in close_rx()
904 eni_dev->rx_map = (struct atm_vcc **) get_zeroed_page(GFP_KERNEL); in start_rx()
905 if (!eni_dev->rx_map) { in start_rx()
907 dev->number); in start_rx()
908 free_page((unsigned long) eni_dev->free_list); in start_rx()
909 return -ENOMEM; in start_rx()
911 eni_dev->rx_mult = DEFAULT_RX_MULT; in start_rx()
912 eni_dev->fast = eni_dev->last_fast = NULL; in start_rx()
913 eni_dev->slow = eni_dev->last_slow = NULL; in start_rx()
914 init_waitqueue_head(&eni_dev->rx_wait); in start_rx()
915 skb_queue_head_init(&eni_dev->rx_queue); in start_rx()
916 eni_dev->serv_read = eni_in(MID_SERV_WRITE); in start_rx()
922 /*----------------------------------- TX ------------------------------------*/
942 init = 4-(paddr & 3); in put_dma()
950 size -= init; in put_dma()
955 init = 8-((paddr & 31) >> 2); in put_dma()
963 words -= init; in put_dma()
1041 EVENT("do_tx: skb=0x%lx, %ld bytes\n",(unsigned long) skb,skb->len); in do_tx()
1042 vcc = ATM_SKB(skb)->vcc; in do_tx()
1044 eni_dev = ENI_DEV(vcc->dev); in do_tx()
1047 tx = eni_vcc->tx; in do_tx()
1051 unsigned int hack = *((char *) skb->data)-'0'; in do_tx()
1054 skb->data += hack; in do_tx()
1055 skb->len -= hack; in do_tx()
1060 if ((unsigned long) skb->data & 3) in do_tx()
1061 printk(KERN_ERR DEV_LABEL "(itf %d): VCI %d has mis-aligned " in do_tx()
1062 "TX data\n",vcc->dev->number,vcc->vci); in do_tx()
1067 * 1 DMA xfer & 2 DMA'ed bytes (protocol layering is for wimps :-) in do_tx()
1070 aal5 = vcc->qos.aal == ATM_AAL5; in do_tx()
1075 four-byte cell header) */ in do_tx()
1077 size = skb->len+4*AAL5_TRAILER+ATM_CELL_PAYLOAD-1; in do_tx()
1079 size = ((size-(size % ATM_CELL_PAYLOAD)) >> 2)+TX_DESCR_SIZE; in do_tx()
1087 if (!NEPMOK(tx->tx_pos,size+TX_GAP, in do_tx()
1088 eni_in(MID_TX_RDPTR(tx->index)),tx->words)) { in do_tx()
1090 vcc->dev->number,size); in do_tx()
1097 mis-alignment fix */ in do_tx()
1098 DPRINTK("iovcnt = %d\n",skb_shinfo(skb)->nr_frags); in do_tx()
1099 if (!skb_shinfo(skb)->nr_frags) dma_size += 5; in do_tx()
1100 else dma_size += 5*(skb_shinfo(skb)->nr_frags+1); in do_tx()
1103 "(got only %d)\n",vcc->dev->number,dma_size,TX_DMA_BUF); in do_tx()
1105 DPRINTK("dma_wr is %d, tx_pos is %ld\n",dma_wr,tx->tx_pos); in do_tx()
1106 if (dma_wr != dma_rd && ((dma_rd+NR_DMA_TX-dma_wr) & (NR_DMA_TX-1)) < in do_tx()
1109 vcc->dev->number); in do_tx()
1112 skb_data3 = skb->data[3]; in do_tx()
1113 paddr = dma_map_single(&eni_dev->pci_dev->dev,skb->data,skb->len, in do_tx()
1116 /* prepare DMA queue entries */ in do_tx()
1118 eni_dev->dma[j++] = (((tx->tx_pos+TX_DESCR_SIZE) & (tx->words-1)) << in do_tx()
1119 MID_DMA_COUNT_SHIFT) | (tx->index << MID_DMA_CHAN_SHIFT) | in do_tx()
1122 if (!skb_shinfo(skb)->nr_frags) in do_tx()
1123 if (aal5) put_dma(tx->index,eni_dev->dma,&j,paddr,skb->len); in do_tx()
1124 else put_dma(tx->index,eni_dev->dma,&j,paddr+4,skb->len-4); in do_tx()
1127 for (i = -1; i < skb_shinfo(skb)->nr_frags; i++) in do_tx()
1128 if (i == -1) in do_tx()
1129 put_dma(tx->index,eni_dev->dma,&j,(unsigned long) in do_tx()
1130 skb->data, in do_tx()
1133 put_dma(tx->index,eni_dev->dma,&j,(unsigned long) in do_tx()
1134 skb_frag_page(&skb_shinfo(skb)->frags[i]) + in do_tx()
1135 skb_frag_off(&skb_shinfo(skb)->frags[i]), in do_tx()
1136 skb_frag_size(&skb_shinfo(skb)->frags[i])); in do_tx()
1138 if (skb->len & 3) { in do_tx()
1139 put_dma(tx->index, eni_dev->dma, &j, eni_dev->zero.dma, in do_tx()
1140 4 - (skb->len & 3)); in do_tx()
1142 /* JK for AAL5 trailer - AAL0 doesn't need it, but who cares ... */ in do_tx()
1143 eni_dev->dma[j++] = (((tx->tx_pos+size) & (tx->words-1)) << in do_tx()
1144 MID_DMA_COUNT_SHIFT) | (tx->index << MID_DMA_CHAN_SHIFT) | in do_tx()
1150 (aal5 ? MID_SEG_AAL5 : 0) | (tx->prescaler << MID_SEG_PR_SHIFT) | in do_tx()
1151 (tx->resolution << MID_SEG_RATE_SHIFT) | in do_tx()
1152 (size/(ATM_CELL_PAYLOAD/4)),tx->send+tx->tx_pos*4); in do_tx()
1153 /*printk("dsc = 0x%08lx\n",(unsigned long) readl(tx->send+tx->tx_pos*4));*/ in do_tx()
1154 writel((vcc->vci << MID_SEG_VCI_SHIFT) | in do_tx()
1156 (ATM_SKB(skb)->atm_options & ATM_ATMOPT_CLP ? MID_SEG_CLP : 0), in do_tx()
1157 tx->send+((tx->tx_pos+1) & (tx->words-1))*4); in do_tx()
1158 DPRINTK("size: %d, len:%d\n",size,skb->len); in do_tx()
1160 writel(skb->len,tx->send+ in do_tx()
1161 ((tx->tx_pos+size-AAL5_TRAILER) & (tx->words-1))*4); in do_tx()
1164 writel(eni_dev->dma[i*2],eni_dev->tx_dma+dma_wr*8); in do_tx()
1165 writel(eni_dev->dma[i*2+1],eni_dev->tx_dma+dma_wr*8+4); in do_tx()
1166 dma_wr = (dma_wr+1) & (NR_DMA_TX-1); in do_tx()
1168 ENI_PRV_POS(skb) = tx->tx_pos; in do_tx()
1170 ENI_VCC(vcc)->txing += size; in do_tx()
1171 tx->tx_pos = (tx->tx_pos+size) & (tx->words-1); in do_tx()
1172 DPRINTK("dma_wr set to %d, tx_pos is now %ld\n",dma_wr,tx->tx_pos); in do_tx()
1174 skb_queue_tail(&eni_dev->tx_queue,skb); in do_tx()
1188 for (i = NR_CHAN-1; i >= 0; i--) { in poll_tx()
1189 tx = &ENI_DEV(dev)->tx[i]; in poll_tx()
1190 if (tx->send) in poll_tx()
1191 while ((skb = skb_dequeue(&tx->backlog))) { in poll_tx()
1194 DPRINTK("re-queuing TX PDU\n"); in poll_tx()
1195 skb_queue_head(&tx->backlog,skb); in poll_tx()
1214 while ((skb = skb_dequeue(&eni_dev->tx_queue))) { in dequeue_tx()
1215 vcc = ATM_SKB(skb)->vcc; in dequeue_tx()
1217 tx = ENI_VCC(vcc)->tx; in dequeue_tx()
1218 NULLCHECK(ENI_VCC(vcc)->tx); in dequeue_tx()
1220 (unsigned) eni_in(MID_TX_DESCRSTART(tx->index))); in dequeue_tx()
1221 if (ENI_VCC(vcc)->txing < tx->words && ENI_PRV_POS(skb) == in dequeue_tx()
1222 eni_in(MID_TX_DESCRSTART(tx->index))) { in dequeue_tx()
1223 skb_queue_head(&eni_dev->tx_queue,skb); in dequeue_tx()
1226 ENI_VCC(vcc)->txing -= ENI_PRV_SIZE(skb); in dequeue_tx()
1227 dma_unmap_single(&eni_dev->pci_dev->dev,ENI_PRV_PADDR(skb),skb->len, in dequeue_tx()
1229 if (vcc->pop) vcc->pop(vcc,skb); in dequeue_tx()
1231 atomic_inc(&vcc->stats->tx); in dequeue_tx()
1232 wake_up(&eni_dev->tx_wait); in dequeue_tx()
1243 if (!eni_dev->tx[i].send) return eni_dev->tx+i; in alloc_tx()
1252 /* 2^(((x+2)^2-(x+2))/2+1) */ in comp_tx()
1263 *res = TS_CLOCK/div-1; in comp_tx()
1268 if (!*pcr) *pcr = eni_dev->tx_bw+reserved; in comp_tx()
1269 for (*pre = 3; *pre >= 0; (*pre)--) in comp_tx()
1270 if (TS_CLOCK/pre_div[*pre]/64 > -*pcr) break; in comp_tx()
1272 div = pre_div[*pre]*-*pcr; in comp_tx()
1274 *res = DIV_ROUND_UP(TS_CLOCK, div)-1; in comp_tx()
1288 struct eni_dev *eni_dev = ENI_DEV(vcc->dev); in reserve_or_set_tx()
1298 ubr = txtp->traffic_class == ATM_UBR; in reserve_or_set_tx()
1299 unlimited = ubr && (!rate || rate <= -ATM_OC3_PCR || in reserve_or_set_tx()
1302 size = txtp->max_sdu*eni_dev->tx_mult/100; in reserve_or_set_tx()
1303 if (size > MID_MAX_BUF_SIZE && txtp->max_sdu <= in reserve_or_set_tx()
1308 if (eni_dev->ubr) { in reserve_or_set_tx()
1309 eni_vcc->tx = eni_dev->ubr; in reserve_or_set_tx()
1310 txtp->pcr = ATM_OC3_PCR; in reserve_or_set_tx()
1315 new_tx = !eni_vcc->tx; in reserve_or_set_tx()
1317 if (!new_tx) tx = eni_vcc->tx; in reserve_or_set_tx()
1320 if (!mem) return -ENOBUFS; in reserve_or_set_tx()
1324 return -EBUSY; in reserve_or_set_tx()
1326 DPRINTK("got chan %d\n",tx->index); in reserve_or_set_tx()
1327 tx->reserved = tx->shaping = 0; in reserve_or_set_tx()
1328 tx->send = mem; in reserve_or_set_tx()
1329 tx->words = size >> 2; in reserve_or_set_tx()
1330 skb_queue_head_init(&tx->backlog); in reserve_or_set_tx()
1333 ((tx->send-eni_dev->ram) >> (MID_LOC_SKIP+2)), in reserve_or_set_tx()
1334 MID_TX_PLACE(tx->index)); in reserve_or_set_tx()
1335 tx->tx_pos = eni_in(MID_TX_DESCRSTART(tx->index)) & in reserve_or_set_tx()
1338 error = comp_tx(eni_dev,&rate,tx->reserved,&pre,&res,unlimited); in reserve_or_set_tx()
1339 if (!error && txtp->min_pcr > rate) error = -EINVAL; in reserve_or_set_tx()
1340 if (!error && txtp->max_pcr && txtp->max_pcr != ATM_MAX_PCR && in reserve_or_set_tx()
1341 txtp->max_pcr < rate) error = -EINVAL; in reserve_or_set_tx()
1342 if (!error && !ubr && rate > eni_dev->tx_bw+tx->reserved) in reserve_or_set_tx()
1343 error = -EINVAL; in reserve_or_set_tx()
1344 if (!error && set_rsv && !set_shp && rate < tx->shaping) in reserve_or_set_tx()
1345 error = -EINVAL; in reserve_or_set_tx()
1346 if (!error && !set_rsv && rate > tx->reserved && !ubr) in reserve_or_set_tx()
1347 error = -EINVAL; in reserve_or_set_tx()
1350 tx->send = NULL; in reserve_or_set_tx()
1355 txtp->pcr = rate; in reserve_or_set_tx()
1357 eni_dev->tx_bw += tx->reserved; in reserve_or_set_tx()
1358 tx->reserved = rate; in reserve_or_set_tx()
1359 eni_dev->tx_bw -= rate; in reserve_or_set_tx()
1362 if (unlimited && new_tx) eni_dev->ubr = tx; in reserve_or_set_tx()
1363 tx->prescaler = pre; in reserve_or_set_tx()
1364 tx->resolution = res; in reserve_or_set_tx()
1365 tx->shaping = rate; in reserve_or_set_tx()
1367 if (set_shp) eni_vcc->tx = tx; in reserve_or_set_tx()
1368 DPRINTK("rsv %d shp %d\n",tx->reserved,tx->shaping); in reserve_or_set_tx()
1375 ENI_VCC(vcc)->tx = NULL; in open_tx_first()
1376 if (vcc->qos.txtp.traffic_class == ATM_NONE) return 0; in open_tx_first()
1377 ENI_VCC(vcc)->txing = 0; in open_tx_first()
1378 return reserve_or_set_tx(vcc,&vcc->qos.txtp,1,1); in open_tx_first()
1395 if (!eni_vcc->tx) return; in close_tx()
1396 eni_dev = ENI_DEV(vcc->dev); in close_tx()
1397 /* wait for TX queue to drain */ in close_tx()
1399 add_wait_queue(&eni_dev->tx_wait,&wait); in close_tx()
1404 tasklet_disable(&eni_dev->task); in close_tx()
1405 txing = skb_peek(&eni_vcc->tx->backlog) || eni_vcc->txing; in close_tx()
1406 tasklet_enable(&eni_dev->task); in close_tx()
1408 DPRINTK("%d TX left\n",eni_vcc->txing); in close_tx()
1413 remove_wait_queue(&eni_dev->tx_wait,&wait); in close_tx()
1414 if (eni_vcc->tx != eni_dev->ubr) { in close_tx()
1420 while (eni_in(MID_TX_RDPTR(eni_vcc->tx->index)) != in close_tx()
1421 eni_in(MID_TX_DESCRSTART(eni_vcc->tx->index))) in close_tx()
1423 eni_free_mem(eni_dev,eni_vcc->tx->send,eni_vcc->tx->words << 2); in close_tx()
1424 eni_vcc->tx->send = NULL; in close_tx()
1425 eni_dev->tx_bw += eni_vcc->tx->reserved; in close_tx()
1427 eni_vcc->tx = NULL; in close_tx()
1437 eni_dev->lost = 0; in start_tx()
1438 eni_dev->tx_bw = ATM_OC3_PCR; in start_tx()
1439 eni_dev->tx_mult = DEFAULT_TX_MULT; in start_tx()
1440 init_waitqueue_head(&eni_dev->tx_wait); in start_tx()
1441 eni_dev->ubr = NULL; in start_tx()
1442 skb_queue_head_init(&eni_dev->tx_queue); in start_tx()
1445 eni_dev->tx[i].send = NULL; in start_tx()
1446 eni_dev->tx[i].index = i; in start_tx()
1452 /*--------------------------------- common ----------------------------------*/
1457 static void foo(void)
1464 if (eni_boards) printk(KERN_INFO "loss: %ld\n",ENI_DEV(eni_boards)->lost);
1474 printk(KERN_CRIT DEV_LABEL "(itf %d): driver error - DMA " in bug_int()
1475 "error\n",dev->number); in bug_int()
1477 printk(KERN_CRIT DEV_LABEL "(itf %d): driver error - ident " in bug_int()
1478 "mismatch\n",dev->number); in bug_int()
1480 printk(KERN_CRIT DEV_LABEL "(itf %d): driver error - DMA " in bug_int()
1481 "overflow\n",dev->number); in bug_int()
1482 EVENT("---dump ends here---\n",0,0); in bug_int()
1483 printk(KERN_NOTICE "---recent events---\n"); in bug_int()
1501 * them, so they re-occur and we never make it to the tasklet. Since in eni_int()
1503 * with eni_dev->events == 0. in eni_int()
1507 eni_dev->lost += eni_in(MID_STAT) & MID_OVFL_TRASH; in eni_int()
1511 dev->phy->interrupt(dev); in eni_int()
1513 foo(); in eni_int()
1516 spin_lock(&eni_dev->lock); in eni_int()
1517 eni_dev->events |= reason; in eni_int()
1518 spin_unlock(&eni_dev->lock); in eni_int()
1519 tasklet_schedule(&eni_dev->task); in eni_int()
1532 spin_lock_irqsave(&eni_dev->lock,flags); in eni_tasklet()
1533 events = xchg(&eni_dev->events,0); in eni_tasklet()
1534 spin_unlock_irqrestore(&eni_dev->lock,flags); in eni_tasklet()
1557 wake_up(&eni_dev->tx_wait); in eni_tasklet()
1568 /*--------------------------------- entries ---------------------------------*/
1572 "MMF", "SMF", "MMF", "03?", /* 0- 3 */
1573 "UTP", "05?", "06?", "07?", /* 4- 7 */
1574 "TAXI","09?", "10?", "11?", /* 8-11 */
1575 "12?", "13?", "14?", "15?", /* 12-15 */
1576 "MMF", "SMF", "18?", "19?", /* 16-19 */
1577 "UTP", "21?", "22?", "23?", /* 20-23 */
1578 "24?", "25?", "26?", "27?", /* 24-27 */
1579 "28?", "29?", "30?", "31?" /* 28-31 */
1585 pci_error = pci_write_config_byte(eni_dev->pci_dev,PCI_TONGA_CTRL,tonga); \
1590 pci_error = pci_read_config_byte(eni_dev->pci_dev,PCI_TONGA_CTRL,&tonga); \
1618 for (j = 7; j >= 0; j--) { in get_esi_asic()
1638 if (failed) error = -EIO; in get_esi_asic()
1640 dev->esi[i] = 0; in get_esi_asic()
1641 for (j = 7; j >= 0; j--) { in get_esi_asic()
1642 dev->esi[i] <<= 1; in get_esi_asic()
1648 if (tonga & SEPROM_DATA) dev->esi[i] |= 1; in get_esi_asic()
1660 if (!(tonga & SEPROM_DATA)) error = -EIO; in get_esi_asic()
1676 "(0x%02x)\n",dev->number,pci_error); in get_esi_asic()
1677 error = -EIO; in get_esi_asic()
1692 mac_base = base+EPROM_SIZE-sizeof(struct midway_eprom); in get_esi_fpga()
1693 for (i = 0; i < ESI_LEN; i++) dev->esi[i] = readb(mac_base+(i^3)); in get_esi_fpga()
1708 dev->ci_range.vpi_bits = 0; in eni_do_init()
1709 dev->ci_range.vci_bits = NR_VCI_LD; in eni_do_init()
1710 dev->link_rate = ATM_OC3_PCR; in eni_do_init()
1712 pci_dev = eni_dev->pci_dev; in eni_do_init()
1714 eni_dev->irq = pci_dev->irq; in eni_do_init()
1717 (eni_dev->asic ? PCI_COMMAND_PARITY | PCI_COMMAND_SERR : 0)))) { in eni_do_init()
1719 "(0x%02x)\n",dev->number,error); in eni_do_init()
1720 return -EIO; in eni_do_init()
1723 dev->number,pci_dev->revision,real_base,eni_dev->irq); in eni_do_init()
1727 "mapping\n",dev->number); in eni_do_init()
1728 return -ENOMEM; in eni_do_init()
1730 eni_dev->ioaddr = base; in eni_do_init()
1731 eni_dev->base_diff = real_base - (unsigned long) base; in eni_do_init()
1732 /* id may not be present in ASIC Tonga boards - check this @@@ */ in eni_do_init()
1733 if (!eni_dev->asic) { in eni_do_init()
1734 eprom = (base+EPROM_SIZE-sizeof(struct midway_eprom)); in eni_do_init()
1735 if (readl(&eprom->magic) != ENI155_MAGIC) { in eni_do_init()
1738 "(itf %d): bad magic - expected 0x%x, got 0x%x\n", in eni_do_init()
1739 dev->number, ENI155_MAGIC, in eni_do_init()
1740 (unsigned)readl(&eprom->magic)); in eni_do_init()
1741 error = -EINVAL; in eni_do_init()
1745 eni_dev->phy = base+PHY_BASE; in eni_do_init()
1746 eni_dev->reg = base+REG_BASE; in eni_do_init()
1747 eni_dev->ram = base+RAM_BASE; in eni_do_init()
1748 last = MAP_MAX_SIZE-RAM_BASE; in eni_do_init()
1749 for (i = last-RAM_INCREMENT; i >= 0; i -= RAM_INCREMENT) { in eni_do_init()
1750 writel(0x55555555,eni_dev->ram+i); in eni_do_init()
1751 if (readl(eni_dev->ram+i) != 0x55555555) last = i; in eni_do_init()
1753 writel(0xAAAAAAAA,eni_dev->ram+i); in eni_do_init()
1754 if (readl(eni_dev->ram+i) != 0xAAAAAAAA) last = i; in eni_do_init()
1755 else writel(i,eni_dev->ram+i); in eni_do_init()
1759 if (readl(eni_dev->ram+i) != i) break; in eni_do_init()
1760 eni_dev->mem = i; in eni_do_init()
1761 memset_io(eni_dev->ram,0,eni_dev->mem); in eni_do_init()
1763 printk("mem=%dkB (",eni_dev->mem >> 10); in eni_do_init()
1764 /* TODO: check for non-SUNI, check for TAXI ? */ in eni_do_init()
1765 if (!(eni_in(MID_RES_ID_MCON) & 0x200) != !eni_dev->asic) { in eni_do_init()
1767 printk(KERN_ERR DEV_LABEL "(itf %d): ERROR - wrong id 0x%x\n", in eni_do_init()
1768 dev->number,(unsigned) eni_in(MID_RES_ID_MCON)); in eni_do_init()
1769 error = -EINVAL; in eni_do_init()
1772 error = eni_dev->asic ? get_esi_asic(dev) : get_esi_fpga(dev,base); in eni_do_init()
1776 printk("%s%02X",i ? "-" : "",dev->esi[i]); in eni_do_init()
1778 printk(KERN_NOTICE DEV_LABEL "(itf %d): %s,%s\n",dev->number, in eni_do_init()
1796 dev->phy->stop(dev); in eni_do_release()
1797 dev->phy = NULL; in eni_do_release()
1798 iounmap(ed->ioaddr); in eni_do_release()
1811 if (request_irq(eni_dev->irq,&eni_int,IRQF_SHARED,DEV_LABEL,dev)) { in eni_start()
1813 dev->number,eni_dev->irq); in eni_start()
1814 error = -EAGAIN; in eni_start()
1817 pci_set_master(eni_dev->pci_dev); in eni_start()
1818 if ((error = pci_write_config_word(eni_dev->pci_dev,PCI_COMMAND, in eni_start()
1820 (eni_dev->asic ? PCI_COMMAND_PARITY | PCI_COMMAND_SERR : 0)))) { in eni_start()
1822 "master (0x%02x)\n",dev->number,error); in eni_start()
1825 if ((error = pci_write_config_byte(eni_dev->pci_dev,PCI_TONGA_CTRL, in eni_start()
1828 "(0x%02x)\n",dev->number,error); in eni_start()
1832 eni_dev->vci = eni_dev->ram; in eni_start()
1833 eni_dev->rx_dma = eni_dev->ram+NR_VCI*16; in eni_start()
1834 eni_dev->tx_dma = eni_dev->rx_dma+NR_DMA_RX*8; in eni_start()
1835 eni_dev->service = eni_dev->tx_dma+NR_DMA_TX*8; in eni_start()
1836 buf = eni_dev->service+NR_SERVICE*4; in eni_start()
1838 eni_dev->vci,eni_dev->rx_dma,eni_dev->tx_dma, in eni_start()
1839 eni_dev->service,buf); in eni_start()
1840 spin_lock_init(&eni_dev->lock); in eni_start()
1841 tasklet_init(&eni_dev->task,eni_tasklet,(unsigned long) dev); in eni_start()
1842 eni_dev->events = 0; in eni_start()
1844 buffer_mem = eni_dev->mem - (buf - eni_dev->ram); in eni_start()
1845 eni_dev->free_list_size = buffer_mem/MID_MIN_BUF_SIZE/2; in eni_start()
1846 eni_dev->free_list = kmalloc_array(eni_dev->free_list_size + 1, in eni_start()
1847 sizeof(*eni_dev->free_list), in eni_start()
1849 if (!eni_dev->free_list) { in eni_start()
1851 dev->number); in eni_start()
1852 error = -ENOMEM; in eni_start()
1855 eni_dev->free_len = 0; in eni_start()
1857 memset_io(eni_dev->vci,0,16*NR_VCI); /* clear VCI table */ in eni_start()
1872 error = dev->phy->start(dev); in eni_start()
1882 kfree(eni_dev->free_list); in eni_start()
1885 free_irq(eni_dev->irq, dev); in eni_start()
1896 clear_bit(ATM_VF_READY,&vcc->flags); in eni_close()
1902 vcc->dev_data = NULL; in eni_close()
1903 clear_bit(ATM_VF_ADDR,&vcc->flags); in eni_close()
1904 /*foo();*/ in eni_close()
1912 short vpi = vcc->vpi; in eni_open()
1913 int vci = vcc->vci; in eni_open()
1917 if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) in eni_open()
1918 vcc->dev_data = NULL; in eni_open()
1920 set_bit(ATM_VF_ADDR,&vcc->flags); in eni_open()
1921 if (vcc->qos.aal != ATM_AAL0 && vcc->qos.aal != ATM_AAL5) in eni_open()
1922 return -EINVAL; in eni_open()
1923 DPRINTK(DEV_LABEL "(itf %d): open %d.%d\n",vcc->dev->number,vcc->vpi, in eni_open()
1924 vcc->vci); in eni_open()
1925 if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) { in eni_open()
1927 if (!eni_vcc) return -ENOMEM; in eni_open()
1928 vcc->dev_data = eni_vcc; in eni_open()
1929 eni_vcc->tx = NULL; /* for eni_close after open_rx */ in eni_open()
1948 set_bit(ATM_VF_READY,&vcc->flags); in eni_open()
1956 struct eni_dev *eni_dev = ENI_DEV(vcc->dev); in eni_change_qos()
1957 struct eni_tx *tx = ENI_VCC(vcc)->tx; in eni_change_qos()
1961 if (qos->txtp.traffic_class == ATM_NONE) return 0; in eni_change_qos()
1962 if (tx == eni_dev->ubr) return -EBADFD; in eni_change_qos()
1963 rate = atm_pcr_goal(&qos->txtp); in eni_change_qos()
1964 if (rate < 0) rate = -rate; in eni_change_qos()
1966 if ((flgs & ATM_MF_DEC_RSV) && rate && rate < tx->reserved) rsv = 1; in eni_change_qos()
1967 if ((flgs & ATM_MF_INC_RSV) && (!rate || rate > tx->reserved)) rsv = 1; in eni_change_qos()
1968 if ((flgs & ATM_MF_DEC_SHP) && rate && rate < tx->shaping) shp = 1; in eni_change_qos()
1969 if ((flgs & ATM_MF_INC_SHP) && (!rate || rate > tx->shaping)) shp = 1; in eni_change_qos()
1971 error = reserve_or_set_tx(vcc,&qos->txtp,rsv,shp); in eni_change_qos()
1978 tasklet_disable(&eni_dev->task); in eni_change_qos()
1979 skb_queue_walk(&eni_dev->tx_queue, skb) { in eni_change_qos()
1982 if (ATM_SKB(skb)->vcc != vcc) continue; in eni_change_qos()
1983 dsc = tx->send+ENI_PRV_POS(skb)*4; in eni_change_qos()
1985 (tx->prescaler << MID_SEG_PR_SHIFT) | in eni_change_qos()
1986 (tx->resolution << MID_SEG_RATE_SHIFT), dsc); in eni_change_qos()
1988 tasklet_enable(&eni_dev->task); in eni_change_qos()
1998 if (!capable(CAP_NET_ADMIN)) return -EPERM; in eni_ioctl()
2000 "instead of obsolete ioctl ENI_MEMDUMP\n",dev->number); in eni_ioctl()
2007 if (!capable(CAP_NET_ADMIN)) return -EPERM; in eni_ioctl()
2010 return -EFAULT; in eni_ioctl()
2013 return -EINVAL; in eni_ioctl()
2014 if (mult.tx) eni_dev->tx_mult = mult.tx; in eni_ioctl()
2015 if (mult.rx) eni_dev->rx_mult = mult.rx; in eni_ioctl()
2022 return -EFAULT; in eni_ioctl()
2026 return -EINVAL; in eni_ioctl()
2028 if (!dev->phy->ioctl) return -ENOIOCTLCMD; in eni_ioctl()
2029 return dev->phy->ioctl(dev,cmd,arg); in eni_ioctl()
2037 if (!ENI_VCC(vcc)->tx) { in eni_send()
2038 if (vcc->pop) vcc->pop(vcc,skb); in eni_send()
2040 return -EINVAL; in eni_send()
2044 if (vcc->pop) vcc->pop(vcc,skb); in eni_send()
2045 return -EINVAL; in eni_send()
2047 if (vcc->qos.aal == ATM_AAL0) { in eni_send()
2048 if (skb->len != ATM_CELL_SIZE-1) { in eni_send()
2049 if (vcc->pop) vcc->pop(vcc,skb); in eni_send()
2051 return -EINVAL; in eni_send()
2053 *(u32 *) skb->data = htonl(*(u32 *) skb->data); in eni_send()
2056 ATM_SKB(skb)->vcc = vcc; in eni_send()
2057 tasklet_disable(&ENI_DEV(vcc->dev)->task); in eni_send()
2059 tasklet_enable(&ENI_DEV(vcc->dev)->task); in eni_send()
2061 skb_queue_tail(&ENI_VCC(vcc)->tx->backlog,skb); in eni_send()
2063 tasklet_schedule(&ENI_DEV(vcc->dev)->task); in eni_send()
2070 writel(value,ENI_DEV(dev)->phy+addr*4); in eni_phy_put()
2077 return readl(ENI_DEV(dev)->phy+addr*4); in eni_phy_get()
2092 "%d cps remaining\n",dev->number,signal[(int) dev->signal], in eni_proc_read()
2093 eni_dev->mem >> 10,eni_dev->tx_bw); in eni_proc_read()
2094 if (!--left) in eni_proc_read()
2137 if (!--left) in eni_proc_read()
2139 "",eni_dev->tx_mult,eni_dev->rx_mult); in eni_proc_read()
2141 struct eni_tx *tx = eni_dev->tx+i; in eni_proc_read()
2143 if (!tx->send) continue; in eni_proc_read()
2144 if (!--left) { in eni_proc_read()
2145 return sprintf(page, "tx[%d]: 0x%lx-0x%lx " in eni_proc_read()
2147 (unsigned long) (tx->send - eni_dev->ram), in eni_proc_read()
2148 tx->send-eni_dev->ram+tx->words*4-1,tx->words*4, in eni_proc_read()
2149 tx->reserved,tx->shaping, in eni_proc_read()
2150 tx == eni_dev->ubr ? " (UBR)" : ""); in eni_proc_read()
2152 if (--left) continue; in eni_proc_read()
2154 skb_queue_len(&tx->backlog)); in eni_proc_read()
2165 if (vcc->dev != dev) in eni_proc_read()
2168 if (--left) continue; in eni_proc_read()
2169 length = sprintf(page,"vcc %4d: ",vcc->vci); in eni_proc_read()
2170 if (eni_vcc->rx) { in eni_proc_read()
2171 length += sprintf(page+length, "0x%lx-0x%lx " in eni_proc_read()
2173 (unsigned long) (eni_vcc->recv - eni_dev->ram), in eni_proc_read()
2174 eni_vcc->recv-eni_dev->ram+eni_vcc->words*4-1, in eni_proc_read()
2175 eni_vcc->words*4); in eni_proc_read()
2176 if (eni_vcc->tx) length += sprintf(page+length,", "); in eni_proc_read()
2178 if (eni_vcc->tx) in eni_proc_read()
2180 eni_vcc->tx->index,eni_vcc->txing); in eni_proc_read()
2187 for (i = 0; i < eni_dev->free_len; i++) { in eni_proc_read()
2188 struct eni_free *fe = eni_dev->free_list+i; in eni_proc_read()
2191 if (--left) continue; in eni_proc_read()
2192 offset = (unsigned long) eni_dev->ram+eni_dev->base_diff; in eni_proc_read()
2193 return sprintf(page,"free %p-%p (%6d bytes)\n", in eni_proc_read()
2194 fe->start-offset,fe->start-offset+(1 << fe->order)-1, in eni_proc_read()
2195 1 << fe->order); in eni_proc_read()
2225 rc = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32)); in eni_init_one()
2229 rc = -ENOMEM; in eni_init_one()
2234 zero = &eni_dev->zero; in eni_init_one()
2235 zero->addr = dma_alloc_coherent(&pci_dev->dev, in eni_init_one()
2236 ENI_ZEROES_SIZE, &zero->dma, GFP_KERNEL); in eni_init_one()
2237 if (!zero->addr) in eni_init_one()
2240 dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &ops, -1, NULL); in eni_init_one()
2244 dev->dev_data = eni_dev; in eni_init_one()
2246 eni_dev->pci_dev = pci_dev; in eni_init_one()
2247 eni_dev->asic = ent->driver_data; in eni_init_one()
2257 eni_dev->more = eni_boards; in eni_init_one()
2267 dma_free_coherent(&pci_dev->dev, ENI_ZEROES_SIZE, zero->addr, zero->dma); in eni_init_one()
2288 struct eni_zero *zero = &ed->zero; in eni_remove_one()
2292 dma_free_coherent(&pdev->dev, ENI_ZEROES_SIZE, zero->addr, zero->dma); in eni_remove_one()
2310 BUILD_BUG_ON(sizeof(skb->cb) < sizeof(struct eni_skb_prv)); in eni_init()