Lines Matching +full:max +full:- +full:reason
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* drivers/atm/zatm.c - ZeitNet ZN122x device driver */
4 /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
21 #include <linux/dma-mapping.h>
44 * - support 64 kB SDUs (will have to use multibuffer batches then :-( )
45 * - proper use of CDV, credit = max(1,CDVT*PCR)
46 * - AAL0
47 * - better receive timestamps
48 * - OAM
107 printk(KERN_NOTICE "----- event dump follows -----\n"); in event_dump()
113 printk(KERN_NOTICE "----- event dump ends here -----\n"); in event_dump()
127 #define zin_n(r) inl(zatm_dev->base+r*4)
128 #define zin(r) inl(zatm_dev->base+uPD98401_##r*4)
129 #define zout(v,r) outl(v,zatm_dev->base+uPD98401_##r*4)
139 /*-------------------------------- utilities --------------------------------*/
161 /*------------------------------- free lists --------------------------------*/
191 pool-ZATM_AAL5_POOL_BASE))+sizeof(struct rx_buffer_head); in refill_pool()
198 offset = zatm_dev->pool_info[pool].offset+ in refill_pool()
202 spin_lock_irqsave(&zatm_dev->lock, flags); in refill_pool()
203 free = zpeekl(zatm_dev,zatm_dev->pool_base+2*pool) & in refill_pool()
205 spin_unlock_irqrestore(&zatm_dev->lock, flags); in refill_pool()
206 if (free >= zatm_dev->pool_info[pool].low_water) return; in refill_pool()
208 zpeekl(zatm_dev,zatm_dev->pool_base+2*pool), in refill_pool()
209 zpeekl(zatm_dev,zatm_dev->pool_base+2*pool+1)); in refill_pool()
213 while (free < zatm_dev->pool_info[pool].high_water) { in refill_pool()
219 "skb (%d) with %d free\n",dev->number,size,free); in refill_pool()
222 skb_reserve(skb,(unsigned char *) ((((unsigned long) skb->data+ in refill_pool()
223 align+offset-1) & ~(unsigned long) (align-1))-offset)- in refill_pool()
224 skb->data); in refill_pool()
225 head = (struct rx_buffer_head *) skb->data; in refill_pool()
229 head->buffer = virt_to_bus(skb->data); in refill_pool()
230 head->link = 0; in refill_pool()
231 head->skb = skb; in refill_pool()
234 spin_lock_irqsave(&zatm_dev->lock, flags); in refill_pool()
235 if (zatm_dev->last_free[pool]) in refill_pool()
236 ((struct rx_buffer_head *) (zatm_dev->last_free[pool]-> in refill_pool()
237 data))[-1].link = virt_to_bus(head); in refill_pool()
238 zatm_dev->last_free[pool] = skb; in refill_pool()
239 skb_queue_tail(&zatm_dev->pool[pool],skb); in refill_pool()
240 spin_unlock_irqrestore(&zatm_dev->lock, flags); in refill_pool()
244 spin_lock_irqsave(&zatm_dev->lock, flags); in refill_pool()
249 spin_unlock_irqrestore(&zatm_dev->lock, flags); in refill_pool()
251 zpeekl(zatm_dev,zatm_dev->pool_base+2*pool), in refill_pool()
252 zpeekl(zatm_dev,zatm_dev->pool_base+2*pool+1)); in refill_pool()
260 skb_queue_purge(&ZATM_DEV(dev)->pool[pool]); in drain_free()
271 if (max_pdu > 65536) return -1; in pool_index()
287 if (!(zatm_dev->pool_info[pool].ref_count++)) { in use_pool()
288 skb_queue_head_init(&zatm_dev->pool[pool]); in use_pool()
289 size = pool-ZATM_AAL5_POOL_BASE; in use_pool()
292 spin_lock_irqsave(&zatm_dev->lock, flags); in use_pool()
293 zpokel(zatm_dev,((zatm_dev->pool_info[pool].low_water/4) << in use_pool()
297 zatm_dev->pool_base+pool*2); in use_pool()
298 zpokel(zatm_dev,(unsigned long) dummy,zatm_dev->pool_base+ in use_pool()
300 spin_unlock_irqrestore(&zatm_dev->lock, flags); in use_pool()
301 zatm_dev->last_free[pool] = NULL; in use_pool()
304 DPRINTK("pool %d: %d\n",pool,zatm_dev->pool_info[pool].ref_count); in use_pool()
310 if (!(--ZATM_DEV(dev)->pool_info[pool].ref_count)) in unuse_pool()
314 /*----------------------------------- RX ------------------------------------*/
321 struct zatm_dev *zatm_dev = ZATM_DEV(vcc->dev);
329 zpeekl(zatm_dev,zatm_vcc->tx_chan*VC_SIZE/4+i));
332 zpeekl(zatm_dev,uPD98401_IM(zatm_vcc->shaper)+16*i));
333 qrp = (unsigned long *) zpeekl(zatm_dev,zatm_vcc->tx_chan*VC_SIZE/4+
370 pos = (zatm_dev->mbx_start[mbx] & ~0xffffUL) | zin(MTA(mbx)); in poll_rx()
379 if (((pos += 16) & 0xffff) == zatm_dev->mbx_end[mbx]) in poll_rx()
380 pos = zatm_dev->mbx_start[mbx]; in poll_rx()
387 zatm_dev->pool_base), in poll_rx()
388 zpeekl(zatm_dev,zatm_dev->pool_base+1)); in poll_rx()
403 skb = ((struct rx_buffer_head *) bus_to_virt(here[2]))->skb; in poll_rx()
406 printk("[-3..0] 0x%08lx 0x%08lx 0x%08lx 0x%08lx\n",((unsigned *) skb->data)[-3], in poll_rx()
407 ((unsigned *) skb->data)[-2],((unsigned *) skb->data)[-1], in poll_rx()
408 ((unsigned *) skb->data)[0]); in poll_rx()
415 size = error ? 0 : ntohs(((__be16 *) skb->data)[cells* in poll_rx()
416 ATM_CELL_PAYLOAD/sizeof(u16)-3]); in poll_rx()
420 if (chan < zatm_dev->chans && zatm_dev->rx_map[chan]) { in poll_rx()
422 vcc = zatm_dev->rx_map[chan]; in poll_rx()
423 pos = ZATM_VCC(vcc)->pool; in poll_rx()
424 if (skb == zatm_dev->last_free[pos]) in poll_rx()
425 zatm_dev->last_free[pos] = NULL; in poll_rx()
426 skb_unlink(skb, zatm_dev->pool + pos); in poll_rx()
430 "for non-existing channel\n",dev->number); in poll_rx()
442 "chan %d error %s\n",dev->number,chan, in poll_rx()
449 if (size && (size > cells*ATM_CELL_PAYLOAD-ATM_AAL5_TRAILER || in poll_rx()
450 size <= (cells-1)*ATM_CELL_PAYLOAD-ATM_AAL5_TRAILER)) { in poll_rx()
452 "cells\n",dev->number,size,cells); in poll_rx()
458 "(%d)\n",dev->number,size); in poll_rx()
464 if (vcc) atomic_inc(&vcc->stats->rx_err); in poll_rx()
467 if (!atm_charge(vcc,skb->truesize)) { in poll_rx()
471 skb->len = size; in poll_rx()
472 ATM_SKB(skb)->vcc = vcc; in poll_rx()
473 vcc->push(vcc,skb); in poll_rx()
474 atomic_inc(&vcc->stats->rx); in poll_rx()
478 refill_pool(dev,zatm_vcc->pool); in poll_rx()
493 zatm_dev = ZATM_DEV(vcc->dev); in open_rx_first()
495 zatm_vcc->rx_chan = 0; in open_rx_first()
496 if (vcc->qos.rxtp.traffic_class == ATM_NONE) return 0; in open_rx_first()
497 if (vcc->qos.aal == ATM_AAL5) { in open_rx_first()
498 if (vcc->qos.rxtp.max_sdu > 65464) in open_rx_first()
499 vcc->qos.rxtp.max_sdu = 65464; in open_rx_first()
500 /* fix this - we may want to receive 64kB SDUs in open_rx_first()
502 cells = DIV_ROUND_UP(vcc->qos.rxtp.max_sdu + ATM_AAL5_TRAILER, in open_rx_first()
504 zatm_vcc->pool = pool_index(cells*ATM_CELL_PAYLOAD); in open_rx_first()
508 zatm_vcc->pool = ZATM_AAL0_POOL; in open_rx_first()
510 if (zatm_vcc->pool < 0) return -EMSGSIZE; in open_rx_first()
511 spin_lock_irqsave(&zatm_dev->lock, flags); in open_rx_first()
517 spin_unlock_irqrestore(&zatm_dev->lock, flags); in open_rx_first()
519 if (!chan) return -EAGAIN; in open_rx_first()
520 use_pool(vcc->dev,zatm_vcc->pool); in open_rx_first()
521 DPRINTK("pool %d\n",zatm_vcc->pool); in open_rx_first()
523 spin_lock_irqsave(&zatm_dev->lock, flags); in open_rx_first()
524 zpokel(zatm_dev,zatm_vcc->pool << uPD98401_RXVC_POOL_SHIFT, in open_rx_first()
526 zpokel(zatm_dev,uPD98401_RXVC_OD | (vcc->qos.aal == ATM_AAL5 ? in open_rx_first()
529 zatm_vcc->rx_chan = chan; in open_rx_first()
530 zatm_dev->rx_map[chan] = vcc; in open_rx_first()
531 spin_unlock_irqrestore(&zatm_dev->lock, flags); in open_rx_first()
544 zatm_dev = ZATM_DEV(vcc->dev); in open_rx_second()
546 if (!zatm_vcc->rx_chan) return 0; in open_rx_second()
547 spin_lock_irqsave(&zatm_dev->lock, flags); in open_rx_second()
549 pos = vcc->vci >> 1; in open_rx_second()
550 shift = (1-(vcc->vci & 1)) << 4; in open_rx_second()
552 ((zatm_vcc->rx_chan | uPD98401_RXLT_ENBL) << shift),pos); in open_rx_second()
553 spin_unlock_irqrestore(&zatm_dev->lock, flags); in open_rx_second()
566 zatm_dev = ZATM_DEV(vcc->dev); in close_rx()
567 if (!zatm_vcc->rx_chan) return; in close_rx()
570 if (vcc->vpi != ATM_VPI_UNSPEC && vcc->vci != ATM_VCI_UNSPEC) { in close_rx()
571 spin_lock_irqsave(&zatm_dev->lock, flags); in close_rx()
572 pos = vcc->vci >> 1; in close_rx()
573 shift = (1-(vcc->vci & 1)) << 4; in close_rx()
579 spin_unlock_irqrestore(&zatm_dev->lock, flags); in close_rx()
581 spin_lock_irqsave(&zatm_dev->lock, flags); in close_rx()
583 zout(uPD98401_DEACT_CHAN | uPD98401_CHAN_RT | (zatm_vcc->rx_chan << in close_rx()
587 zout(uPD98401_CLOSE_CHAN | uPD98401_CHAN_RT | (zatm_vcc->rx_chan << in close_rx()
592 "%d\n",vcc->dev->number,zatm_vcc->rx_chan); in close_rx()
593 spin_unlock_irqrestore(&zatm_dev->lock, flags); in close_rx()
594 zatm_dev->rx_map[zatm_vcc->rx_chan] = NULL; in close_rx()
595 zatm_vcc->rx_chan = 0; in close_rx()
596 unuse_pool(vcc->dev,zatm_vcc->pool); in close_rx()
607 zatm_dev->rx_map = kcalloc(zatm_dev->chans, in start_rx()
608 sizeof(*zatm_dev->rx_map), in start_rx()
610 if (!zatm_dev->rx_map) return -ENOMEM; in start_rx()
612 zpokel(zatm_dev,(1 << dev->ci_range.vci_bits)-1,uPD98401_VRR); in start_rx()
615 zatm_dev->pool_info[i].ref_count = 0; in start_rx()
616 zatm_dev->pool_info[i].rqa_count = 0; in start_rx()
617 zatm_dev->pool_info[i].rqu_count = 0; in start_rx()
618 zatm_dev->pool_info[i].low_water = LOW_MARK; in start_rx()
619 zatm_dev->pool_info[i].high_water = HIGH_MARK; in start_rx()
620 zatm_dev->pool_info[i].offset = 0; in start_rx()
621 zatm_dev->pool_info[i].next_off = 0; in start_rx()
622 zatm_dev->pool_info[i].next_cnt = 0; in start_rx()
623 zatm_dev->pool_info[i].next_thres = OFF_CNG_THRES; in start_rx()
629 /*----------------------------------- TX ------------------------------------*/
642 vcc = ATM_SKB(skb)->vcc; in do_tx()
643 zatm_dev = ZATM_DEV(vcc->dev); in do_tx()
645 EVENT("iovcnt=%d\n",skb_shinfo(skb)->nr_frags,0); in do_tx()
646 spin_lock_irqsave(&zatm_dev->lock, flags); in do_tx()
647 if (!skb_shinfo(skb)->nr_frags) { in do_tx()
648 if (zatm_vcc->txing == RING_ENTRIES-1) { in do_tx()
649 spin_unlock_irqrestore(&zatm_dev->lock, flags); in do_tx()
652 zatm_vcc->txing++; in do_tx()
653 dsc = zatm_vcc->ring+zatm_vcc->ring_curr; in do_tx()
654 zatm_vcc->ring_curr = (zatm_vcc->ring_curr+RING_WORDS) & in do_tx()
655 (RING_ENTRIES*RING_WORDS-1); in do_tx()
657 dsc[2] = skb->len; in do_tx()
658 dsc[3] = virt_to_bus(skb->data); in do_tx()
661 | (vcc->qos.aal == ATM_AAL5 ? uPD98401_TXPD_AAL5 : 0 | in do_tx()
662 (ATM_SKB(skb)->atm_options & ATM_ATMOPT_CLP ? in do_tx()
674 uPD98401_TXBD_SIZE * ATM_SKB(skb)->iovcnt, GFP_ATOMIC); in do_tx()
676 if (vcc->pop) in do_tx()
677 vcc->pop(vcc, skb); in do_tx()
680 return -EAGAIN; in do_tx()
685 (vcc->aal == ATM_AAL5 ? uPD98401_TXPD_AAL5 : 0 | in do_tx()
686 (ATM_SKB(skb)->atm_options & ATM_ATMOPT_CLP ? in do_tx()
689 dsc[2] = ATM_SKB(skb)->iovcnt * uPD98401_TXBD_SIZE; in do_tx()
691 for (i = 0; i < ATM_SKB(skb)->iovcnt; i++) { in do_tx()
692 *put++ = ((struct iovec *) skb->data)[i].iov_len; in do_tx()
694 skb->data)[i].iov_base); in do_tx()
696 put[-2] |= uPD98401_TXBD_LAST; in do_tx()
700 skb_queue_tail(&zatm_vcc->tx_queue,skb); in do_tx()
701 DPRINTK("QRP=0x%08lx\n",zpeekl(zatm_dev,zatm_vcc->tx_chan*VC_SIZE/4+ in do_tx()
704 zout(uPD98401_TX_READY | (zatm_vcc->tx_chan << in do_tx()
706 spin_unlock_irqrestore(&zatm_dev->lock, flags); in do_tx()
719 skb = skb_dequeue(&zatm_vcc->tx_queue); in dequeue_tx()
722 "txing\n",vcc->dev->number); in dequeue_tx()
731 zatm_vcc->txing--; in dequeue_tx()
732 if (vcc->pop) vcc->pop(vcc,skb); in dequeue_tx()
734 while ((skb = skb_dequeue(&zatm_vcc->backlog))) in dequeue_tx()
736 skb_queue_head(&zatm_vcc->backlog,skb); in dequeue_tx()
739 atomic_inc(&vcc->stats->tx); in dequeue_tx()
740 wake_up(&zatm_vcc->tx_wait); in dequeue_tx()
752 pos = (zatm_dev->mbx_start[mbx] & ~0xffffUL) | zin(MTA(mbx)); in poll_tx()
768 chan = (zatm_dev->mbx_start[mbx][pos >> 2] & uPD98401_TXI_CONN) in poll_tx()
771 if (chan < zatm_dev->chans && zatm_dev->tx_map[chan]) in poll_tx()
772 dequeue_tx(zatm_dev->tx_map[chan]); in poll_tx()
775 "for non-existing channel %d\n",dev->number,chan); in poll_tx()
778 if (((pos += 4) & 0xffff) == zatm_dev->mbx_end[mbx]) in poll_tx()
779 pos = zatm_dev->mbx_start[mbx]; in poll_tx()
786 * BUG BUG BUG: Doesn't handle "new-style" rate specification yet.
789 static int alloc_shaper(struct atm_dev *dev,int *pcr,int min,int max,int ubr) in alloc_shaper() argument
796 DPRINTK("alloc_shaper (min = %d, max = %d)\n",min,max); in alloc_shaper()
798 if (!zatm_dev->free_shapers) return -EAGAIN; in alloc_shaper()
799 for (shaper = 0; !((zatm_dev->free_shapers >> shaper) & 1); shaper++); in alloc_shaper()
800 zatm_dev->free_shapers &= ~1 << shaper; in alloc_shaper()
804 zatm_dev->ubr_ref_cnt++; in alloc_shaper()
805 zatm_dev->ubr = shaper; in alloc_shaper()
820 if (max > zatm_dev->tx_bw) max = zatm_dev->tx_bw; in alloc_shaper()
821 if (max <= 255) { in alloc_shaper()
822 i = max; in alloc_shaper()
827 m = DIV_ROUND_UP(ATM_OC3_PCR*255, max); in alloc_shaper()
832 "[%d,%d] -> i=%ld,m=%ld\n",min,max,i,m); in alloc_shaper()
837 if ((min && *pcr < min) || (max && *pcr > max)) return -EINVAL; in alloc_shaper()
838 if (zatm_dev->tx_bw < *pcr) return -EAGAIN; in alloc_shaper()
839 zatm_dev->tx_bw -= *pcr; in alloc_shaper()
841 spin_lock_irqsave(&zatm_dev->lock, flags); in alloc_shaper()
848 spin_unlock_irqrestore(&zatm_dev->lock, flags); in alloc_shaper()
859 if (shaper == zatm_dev->ubr) { in dealloc_shaper()
860 if (--zatm_dev->ubr_ref_cnt) return; in dealloc_shaper()
861 zatm_dev->ubr = -1; in dealloc_shaper()
863 spin_lock_irqsave(&zatm_dev->lock, flags); in dealloc_shaper()
866 spin_unlock_irqrestore(&zatm_dev->lock, flags); in dealloc_shaper()
867 zatm_dev->free_shapers |= 1 << shaper; in dealloc_shaper()
879 zatm_dev = ZATM_DEV(vcc->dev); in close_tx()
880 chan = zatm_vcc->tx_chan; in close_tx()
883 if (skb_peek(&zatm_vcc->backlog)) { in close_tx()
886 wait_event(zatm_vcc->tx_wait, !skb_peek(&zatm_vcc->backlog)); in close_tx()
888 if (skb_peek(&zatm_vcc->tx_queue)) { in close_tx()
891 wait_event(zatm_vcc->tx_wait, !skb_peek(&zatm_vcc->tx_queue)); in close_tx()
893 spin_lock_irqsave(&zatm_dev->lock, flags); in close_tx()
903 "%d\n",vcc->dev->number,chan); in close_tx()
904 spin_unlock_irqrestore(&zatm_dev->lock, flags); in close_tx()
905 zatm_vcc->tx_chan = 0; in close_tx()
906 zatm_dev->tx_map[chan] = NULL; in close_tx()
907 if (zatm_vcc->shaper != zatm_dev->ubr) { in close_tx()
908 zatm_dev->tx_bw += vcc->qos.txtp.min_pcr; in close_tx()
909 dealloc_shaper(vcc->dev,zatm_vcc->shaper); in close_tx()
911 kfree(zatm_vcc->ring); in close_tx()
925 zatm_dev = ZATM_DEV(vcc->dev); in open_tx_first()
927 zatm_vcc->tx_chan = 0; in open_tx_first()
928 if (vcc->qos.txtp.traffic_class == ATM_NONE) return 0; in open_tx_first()
929 spin_lock_irqsave(&zatm_dev->lock, flags); in open_tx_first()
935 spin_unlock_irqrestore(&zatm_dev->lock, flags); in open_tx_first()
937 if (!chan) return -EAGAIN; in open_tx_first()
938 unlimited = vcc->qos.txtp.traffic_class == ATM_UBR && in open_tx_first()
939 (!vcc->qos.txtp.max_pcr || vcc->qos.txtp.max_pcr == ATM_MAX_PCR || in open_tx_first()
940 vcc->qos.txtp.max_pcr >= ATM_OC3_PCR); in open_tx_first()
941 if (unlimited && zatm_dev->ubr != -1) zatm_vcc->shaper = zatm_dev->ubr; in open_tx_first()
945 if (unlimited) vcc->qos.txtp.max_sdu = ATM_MAX_AAL5_PDU; in open_tx_first()
946 if ((zatm_vcc->shaper = alloc_shaper(vcc->dev,&pcr, in open_tx_first()
947 vcc->qos.txtp.min_pcr,vcc->qos.txtp.max_pcr,unlimited)) in open_tx_first()
950 return zatm_vcc->shaper; in open_tx_first()
953 vcc->qos.txtp.min_pcr = vcc->qos.txtp.max_pcr = pcr; in open_tx_first()
955 zatm_vcc->tx_chan = chan; in open_tx_first()
956 skb_queue_head_init(&zatm_vcc->tx_queue); in open_tx_first()
957 init_waitqueue_head(&zatm_vcc->tx_wait); in open_tx_first()
959 zatm_vcc->ring = kzalloc(RING_SIZE,GFP_KERNEL); in open_tx_first()
960 if (!zatm_vcc->ring) return -ENOMEM; in open_tx_first()
961 loop = zatm_vcc->ring+RING_ENTRIES*RING_WORDS; in open_tx_first()
964 loop[3] = virt_to_bus(zatm_vcc->ring); in open_tx_first()
965 zatm_vcc->ring_curr = 0; in open_tx_first()
966 zatm_vcc->txing = 0; in open_tx_first()
967 skb_queue_head_init(&zatm_vcc->backlog); in open_tx_first()
968 zpokel(zatm_dev,virt_to_bus(zatm_vcc->ring), in open_tx_first()
981 zatm_dev = ZATM_DEV(vcc->dev); in open_tx_second()
983 if (!zatm_vcc->tx_chan) return 0; in open_tx_second()
985 spin_lock_irqsave(&zatm_dev->lock, flags); in open_tx_second()
986 zpokel(zatm_dev,0,zatm_vcc->tx_chan*VC_SIZE/4); in open_tx_second()
987 zpokel(zatm_dev,uPD98401_TXVC_L | (zatm_vcc->shaper << in open_tx_second()
988 uPD98401_TXVC_SHP_SHIFT) | (vcc->vpi << uPD98401_TXVC_VPI_SHIFT) | in open_tx_second()
989 vcc->vci,zatm_vcc->tx_chan*VC_SIZE/4+1); in open_tx_second()
990 zpokel(zatm_dev,0,zatm_vcc->tx_chan*VC_SIZE/4+2); in open_tx_second()
991 spin_unlock_irqrestore(&zatm_dev->lock, flags); in open_tx_second()
992 zatm_dev->tx_map[zatm_vcc->tx_chan] = vcc; in open_tx_second()
1004 zatm_dev->tx_map = kmalloc_array(zatm_dev->chans, in start_tx()
1005 sizeof(*zatm_dev->tx_map), in start_tx()
1007 if (!zatm_dev->tx_map) return -ENOMEM; in start_tx()
1008 zatm_dev->tx_bw = ATM_OC3_PCR; in start_tx()
1009 zatm_dev->free_shapers = (1 << NR_SHAPERS)-1; in start_tx()
1010 zatm_dev->ubr = -1; in start_tx()
1011 zatm_dev->ubr_ref_cnt = 0; in start_tx()
1018 /*------------------------------- interrupts --------------------------------*/
1025 u32 reason; in zatm_int() local
1030 while ((reason = zin(GSR))) { in zatm_int()
1032 EVENT("reason 0x%x\n",reason,0); in zatm_int()
1033 if (reason & uPD98401_INT_PI) { in zatm_int()
1035 dev->phy->interrupt(dev); in zatm_int()
1037 if (reason & uPD98401_INT_RQA) { in zatm_int()
1046 zatm_dev->pool_info[i].rqa_count++; in zatm_int()
1051 if (reason & uPD98401_INT_RQU) { in zatm_int()
1056 dev->number,pools); in zatm_int()
1061 zatm_dev->pool_info[i].rqu_count++; in zatm_int()
1067 if (reason & uPD98401_INT_SPE) in zatm_int()
1069 "error at 0x%08x\n",dev->number,zin(ADDR)); in zatm_int()
1070 if (reason & uPD98401_INT_CPE) in zatm_int()
1072 "parity error at 0x%08x\n",dev->number,zin(ADDR)); in zatm_int()
1073 if (reason & uPD98401_INT_SBE) { in zatm_int()
1075 "error at 0x%08x\n",dev->number,zin(ADDR)); in zatm_int()
1079 if (reason & uPD98401_INT_MF) { in zatm_int()
1081 "(0x%x)\n",dev->number,(reason & uPD98401_INT_MF) in zatm_int()
1086 if (reason & uPD98401_INT_MM) { in zatm_int()
1087 if (reason & 1) poll_rx(dev,0); in zatm_int()
1088 if (reason & 2) poll_rx(dev,1); in zatm_int()
1089 if (reason & 4) poll_tx(dev,2); in zatm_int()
1090 if (reason & 8) poll_tx(dev,3); in zatm_int()
1098 /*----------------------------- (E)EPROM access -----------------------------*/
1106 if ((error = pci_write_config_dword(zatm_dev->pci_dev,cmd,value))) in eprom_set()
1117 if ((error = pci_read_config_dword(zatm_dev->pci_dev,cmd,&value))) in eprom_get()
1130 for (i = bits-1; i >= 0; i--) { in eprom_put_bits()
1145 for (i = 8; i; i--) { in eprom_get_byte()
1168 eprom_get_byte(zatm_dev,buf+i+1-swap,cmd); in eprom_try_esi()
1171 memcpy(dev->esi,buf+offset,ESI_LEN); in eprom_try_esi()
1172 return memcmp(dev->esi,"\0\0\0\0\0",ESI_LEN); /* assumes ESI_LEN == 6 */ in eprom_try_esi()
1183 /*--------------------------------- entries ---------------------------------*/
1196 spin_lock_init(&zatm_dev->lock); in zatm_init()
1197 pci_dev = zatm_dev->pci_dev; in zatm_init()
1198 zatm_dev->base = pci_resource_start(pci_dev, 0); in zatm_init()
1199 zatm_dev->irq = pci_dev->irq; in zatm_init()
1202 dev->number,error); in zatm_init()
1203 return -EINVAL; in zatm_init()
1208 "\n",dev->number,error); in zatm_init()
1209 return -EIO; in zatm_init()
1213 dev->number,pci_dev->revision,zatm_dev->base,zatm_dev->irq); in zatm_init()
1219 for (i = last-RAM_INCREMENT; i >= 0; i -= RAM_INCREMENT) { in zatm_init()
1230 zatm_dev->mem = i << 2; in zatm_init()
1231 while (i) zpokel(zatm_dev,0,--i); in zatm_init()
1238 printk("mem=%dkB,%s (",zatm_dev->mem >> 10,zatm_dev->copper ? "UTP" : in zatm_init()
1241 printk("%02X%s",dev->esi[i],i == ESI_LEN-1 ? ")\n" : "-"); in zatm_init()
1245 spin_lock_irqsave(&zatm_dev->lock, flags); in zatm_init()
1251 spin_unlock_irqrestore(&zatm_dev->lock, flags); in zatm_init()
1254 zatm_dev->khz = t2-2*t1+t0; in zatm_init()
1256 "MHz\n",dev->number, in zatm_init()
1258 zin(VER) & uPD98401_MINOR,zatm_dev->khz/1000,zatm_dev->khz % 1000); in zatm_init()
1266 struct pci_dev *pdev = zatm_dev->pci_dev; in zatm_start()
1272 zatm_dev->rx_map = zatm_dev->tx_map = NULL; in zatm_start()
1274 zatm_dev->mbx_start[i] = 0; in zatm_start()
1275 error = request_irq(zatm_dev->irq, zatm_int, IRQF_SHARED, DEV_LABEL, dev); in zatm_start()
1278 dev->number,zatm_dev->irq); in zatm_start()
1285 vccs = (zatm_dev->mem-NR_SHAPERS*SHAPER_SIZE-pools*POOL_SIZE)/ in zatm_start()
1287 ld = -1; in zatm_start()
1289 dev->ci_range.vpi_bits = 0; /* @@@ no VPI for now */ in zatm_start()
1290 dev->ci_range.vci_bits = ld; in zatm_start()
1291 dev->link_rate = ATM_OC3_PCR; in zatm_start()
1292 zatm_dev->chans = vccs; /* ??? */ in zatm_start()
1296 zatm_dev->pool_base = curr; in zatm_start()
1304 "%ld VCs\n",dev->number,NR_SHAPERS,pools,rx, in zatm_start()
1305 (zatm_dev->mem-curr*4)/VC_SIZE); in zatm_start()
1313 mbx = dma_alloc_coherent(&pdev->dev, in zatm_start()
1316 error = -ENOMEM; in zatm_start()
1325 "bus incompatible with driver\n", dev->number); in zatm_start()
1326 dma_free_coherent(&pdev->dev, 2*MBX_SIZE(i), mbx, mbx_dma); in zatm_start()
1327 error = -ENODEV; in zatm_start()
1330 DPRINTK("mbx@0x%08lx-0x%08lx\n", mbx, mbx + MBX_SIZE(i)); in zatm_start()
1331 zatm_dev->mbx_start[i] = (unsigned long)mbx; in zatm_start()
1332 zatm_dev->mbx_dma[i] = mbx_dma; in zatm_start()
1333 zatm_dev->mbx_end[i] = (zatm_dev->mbx_start[i] + MBX_SIZE(i)) & in zatm_start()
1337 zout(zatm_dev->mbx_end[i], MBA(i)); in zatm_start()
1347 error = dev->phy->start(dev); in zatm_start()
1357 kfree(zatm_dev->rx_map); in zatm_start()
1359 kfree(zatm_dev->tx_map); in zatm_start()
1361 while (i-- > 0) { in zatm_start()
1362 dma_free_coherent(&pdev->dev, 2 * MBX_SIZE(i), in zatm_start()
1363 (void *)zatm_dev->mbx_start[i], in zatm_start()
1364 zatm_dev->mbx_dma[i]); in zatm_start()
1366 free_irq(zatm_dev->irq, dev); in zatm_start()
1375 clear_bit(ATM_VF_READY,&vcc->flags); in zatm_close()
1382 vcc->dev_data = NULL; in zatm_close()
1383 clear_bit(ATM_VF_ADDR,&vcc->flags); in zatm_close()
1390 short vpi = vcc->vpi; in zatm_open()
1391 int vci = vcc->vci; in zatm_open()
1395 if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) in zatm_open()
1396 vcc->dev_data = NULL; in zatm_open()
1398 set_bit(ATM_VF_ADDR,&vcc->flags); in zatm_open()
1399 if (vcc->qos.aal != ATM_AAL5) return -EINVAL; /* @@@ AAL0 */ in zatm_open()
1400 DPRINTK(DEV_LABEL "(itf %d): open %d.%d\n",vcc->dev->number,vcc->vpi, in zatm_open()
1401 vcc->vci); in zatm_open()
1402 if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) { in zatm_open()
1405 clear_bit(ATM_VF_ADDR,&vcc->flags); in zatm_open()
1406 return -ENOMEM; in zatm_open()
1408 vcc->dev_data = zatm_vcc; in zatm_open()
1409 ZATM_VCC(vcc)->tx_chan = 0; /* for zatm_close after open_rx */ in zatm_open()
1428 set_bit(ATM_VF_READY,&vcc->flags); in zatm_open()
1436 return -ENOSYS; in zatm_change_qos()
1449 if (!capable(CAP_NET_ADMIN)) return -EPERM; in zatm_ioctl()
1457 &((struct zatm_pool_req __user *) arg)->pool_num)) in zatm_ioctl()
1458 return -EFAULT; in zatm_ioctl()
1460 return -EINVAL; in zatm_ioctl()
1463 spin_lock_irqsave(&zatm_dev->lock, flags); in zatm_ioctl()
1464 info = zatm_dev->pool_info[pool]; in zatm_ioctl()
1466 zatm_dev->pool_info[pool].rqa_count = 0; in zatm_ioctl()
1467 zatm_dev->pool_info[pool].rqu_count = 0; in zatm_ioctl()
1469 spin_unlock_irqrestore(&zatm_dev->lock, flags); in zatm_ioctl()
1471 &((struct zatm_pool_req __user *) arg)->info, in zatm_ioctl()
1472 &info,sizeof(info)) ? -EFAULT : 0; in zatm_ioctl()
1479 if (!capable(CAP_NET_ADMIN)) return -EPERM; in zatm_ioctl()
1481 &((struct zatm_pool_req __user *) arg)->pool_num)) in zatm_ioctl()
1482 return -EFAULT; in zatm_ioctl()
1484 return -EINVAL; in zatm_ioctl()
1488 &((struct zatm_pool_req __user *) arg)->info, in zatm_ioctl()
1489 sizeof(info))) return -EFAULT; in zatm_ioctl()
1491 info.low_water = zatm_dev-> in zatm_ioctl()
1494 info.high_water = zatm_dev-> in zatm_ioctl()
1497 info.next_thres = zatm_dev-> in zatm_ioctl()
1501 return -EINVAL; in zatm_ioctl()
1502 spin_lock_irqsave(&zatm_dev->lock, flags); in zatm_ioctl()
1503 zatm_dev->pool_info[pool].low_water = in zatm_ioctl()
1505 zatm_dev->pool_info[pool].high_water = in zatm_ioctl()
1507 zatm_dev->pool_info[pool].next_thres = in zatm_ioctl()
1509 spin_unlock_irqrestore(&zatm_dev->lock, flags); in zatm_ioctl()
1513 if (!dev->phy->ioctl) return -ENOIOCTLCMD; in zatm_ioctl()
1514 return dev->phy->ioctl(dev,cmd,arg); in zatm_ioctl()
1523 if (!ZATM_VCC(vcc)->tx_chan || !test_bit(ATM_VF_READY,&vcc->flags)) { in zatm_send()
1524 if (vcc->pop) vcc->pop(vcc,skb); in zatm_send()
1526 return -EINVAL; in zatm_send()
1530 if (vcc->pop) vcc->pop(vcc,skb); in zatm_send()
1531 return -EINVAL; in zatm_send()
1533 ATM_SKB(skb)->vcc = vcc; in zatm_send()
1536 skb_queue_tail(&ZATM_VCC(vcc)->backlog,skb); in zatm_send()
1582 int ret = -ENOMEM; in zatm_init_one()
1590 dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &ops, -1, NULL); in zatm_init_one()
1602 ret = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32)); in zatm_init_one()
1606 zatm_dev->pci_dev = pci_dev; in zatm_init_one()
1607 dev->dev_data = zatm_dev; in zatm_init_one()
1608 zatm_dev->copper = (int)ent->driver_data; in zatm_init_one()
1613 zatm_dev->more = zatm_boards; in zatm_init_one()