• Home
  • Raw
  • Download

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

2 /* drivers/atm/firestream.c - FireStream 155 (MB86697) and
8 * and ambassador.c Copyright (C) 1995-1999 Madge Networks Ltd
24 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
67 * pays to have those pre-allocated. Unfortunately, we can't fully
71 * smaller buffers more efficiently than the larger ones. -- REW
76 * from 1024-byte regions anyway. With the size of the sk_buffs (quite
77 * large), it doesn't pay to allocate the smallest size (64) -- REW */
80 * are appreciated. -- REW */
84 * would be interpreted. -- REW */
118 - When disabling channels, write an invalid VP/VC value to the
124 - Don't initialize the match registers to 0, as 0.0 is a valid
132 "interrupt-traffic" for the CPU. This driver requests an interrupt on EVERY
135 Besides that, the userspace->kernel copy and the PCI bus are the
144 -- REW
184 "reserved 30", /* FIXME: The strings between 30-40 might be wrong. */
189 "low priority discard - no receive descriptor",
190 "low priority discard - missing end of packet",
251 #define PHY_EOF -1
252 #define PHY_CLEARALL -2
270 { PHY_EOF, 0}, /* -1 signals end of list */
279 anyway. We therefore have to disable this for production. -- REW */
283 that great without interrupts. -- REW */
289 aid in debugging in the field, I'm leaving the compile-time debug
292 them to recompile... -- REW
307 if you get this with the debug default not set to zero again. -- REW */
320 /* XXX Add rx_buf_sizes, and rx_pool_sizes As per request Amar. -- REW */
353 printk ("%p ", ptr); in my_hd()
366 len -= 16; in my_hd()
376 * I copied it over from the ambassador driver. -- REW */
380 if (ATM_SKB(skb)->vcc->pop) in fs_kfree_skb()
381 ATM_SKB(skb)->vcc->pop (ATM_SKB(skb)->vcc, skb); in fs_kfree_skb()
393 * here and the ambassador driver) -- REW
413 e--;
416 // Now the mantissa is in positions bit 16-25. Excepf for the "hidden 1" that's in bit 26.
424 14 lines-of-code. Compare that with the 120 that the Ambassador
434 for (;!(rate & 0xfe000000);rate <<= 1, e--);
438 Exercise for the reader: Remove one more line-of-code, without
441 manage to lose two lines or more, keep me updated! ;-)
443 -- REW */
454 unsigned char exp = -1; /* hush gcc */ in make_rate()
455 unsigned int man = -1; /* hush gcc */ in make_rate()
459 /* rates in cells per second, ITU format (nasty 16-bit floating-point) in make_rate()
460 given 5-bit e and 9-bit m: in make_rate()
463 (bit 15 is "reserved", bit 14 "non-zero") in make_rate()
465 largest rate is (1+511/512)*2^31 = 4290772992 (< 2^32-1) in make_rate()
466 smallest non-zero rate is (1+0/512)*2^0 = 1 (> 0) in make_rate()
469 remove top bit and shift (rounding if feeling clever) by 9-e in make_rate()
473 when properly merged. -- REW */ in make_rate()
479 return -EINVAL; in make_rate()
491 /* invariant: rate = man*2^(exp-31) */ in make_rate()
493 exp = exp - 1; in make_rate()
498 rate = (2^31+(man-2^31))*2^(exp-31) in make_rate()
499 rate = (1+(man-2^31)/2^31)*2^exp in make_rate()
502 man &= 0xffffffffU; /* a nop on 32-bit systems */ in make_rate()
505 exp is in the range 0 to 31, man is in the range 0 to 2^32-1 in make_rate()
506 time to lose significance... we want m in the range 0 to 2^9-1 in make_rate()
515 man = man>>(32-9); in make_rate()
521 man = (man>>(32-9)) + 1; in make_rate()
528 man = (man>>(32-9)); in make_rate()
534 if (man & (1<<(32-9-1))) { in make_rate()
535 man = (man>>(32-9)) + 1; in make_rate()
542 man = (man>>(32-9)); in make_rate()
549 /* zero rate - not representable */ in make_rate()
552 return -EINVAL; in make_rate()
566 ? (1 << exp) + (man << (exp-9)) in make_rate()
567 : (1 << exp) + ((man + (1<<(9-exp-1))) >> (9-exp)); in make_rate()
576 /* For DEEP-DOWN debugging these can be rigged to intercept accesses to
581 writel (val, dev->base + offset); in write_fs()
587 return readl (dev->base + offset); in read_fs()
594 return bus_to_virt (read_fs (dev, Q_WP(q->offset)) & Q_ADDR_MASK); in get_qentry()
604 still the same as the value passed as qe... -- REW */ in submit_qentry()
606 while ((wp = read_fs (dev, Q_WP (q->offset))) & Q_FULL) { in submit_qentry()
608 q->offset); in submit_qentry()
615 fs_dprintk (FS_DEBUG_TXQ, "q mismatch! %p %p\n", qe, cqe); in submit_qentry()
618 write_fs (dev, Q_WP(q->offset), Q_INCWRAP); in submit_qentry()
625 rp = read_fs (dev, Q_RP(q->offset)); in submit_qentry()
626 wp = read_fs (dev, Q_WP(q->offset)); in submit_qentry()
627 fs_dprintk (FS_DEBUG_TXQ, "q at %d: %x-%x: %x entries.\n", in submit_qentry()
628 q->offset, rp, wp, wp-rp); in submit_qentry()
648 qe->cmd = cmd; in submit_queue()
649 qe->p0 = p1; in submit_queue()
650 qe->p1 = p2; in submit_queue()
651 qe->p2 = p3; in submit_queue()
664 /* Test the "other" way one day... -- REW */
687 while (!((rq = read_fs (dev, Q_RP(q->offset))) & Q_EMPTY)) { in process_return_queue()
692 qe->cmd, qe->p0, qe->p1, qe->p2, STATUS_CODE (qe)); in process_return_queue()
696 tc = bus_to_virt (qe->p0); in process_return_queue()
697 fs_dprintk (FS_DEBUG_ALLOC, "Free tc: %p\n", tc); in process_return_queue()
702 write_fs (dev, Q_RP(q->offset), Q_INCWRAP); in process_return_queue()
715 while (!((rq = read_fs (dev, Q_RP(q->offset))) & Q_EMPTY)) { in process_txdone_queue()
720 qe->cmd, qe->p0, qe->p1, qe->p2, STATUS_CODE (qe)); in process_txdone_queue()
724 qe->cmd, qe->p0, qe->p1, qe->p2, STATUS_CODE (qe)); in process_txdone_queue()
732 tmp = qe->p0; in process_txdone_queue()
738 fs_dprintk (FS_DEBUG_QUEUE, "Pool entry: %08x %08x %08x %08x %p.\n", in process_txdone_queue()
739 td->flags, td->next, td->bsa, td->aal_bufsize, td->skb ); in process_txdone_queue()
741 skb = td->skb; in process_txdone_queue()
742 if (skb == FS_VCC (ATM_SKB(skb)->vcc)->last_skb) { in process_txdone_queue()
743 FS_VCC (ATM_SKB(skb)->vcc)->last_skb = NULL; in process_txdone_queue()
744 wake_up_interruptible (& FS_VCC (ATM_SKB(skb)->vcc)->close_wait); in process_txdone_queue()
746 td->dev->ntxpckts--; in process_txdone_queue()
752 fs_dprintk (FS_DEBUG_QSIZE, "[%d]", td->dev->ntxpckts); in process_txdone_queue()
756 atomic_inc(&ATM_SKB(skb)->vcc->stats->tx); in process_txdone_queue()
759 fs_dprintk (FS_DEBUG_ALLOC, "Free t-skb: %p\n", skb); in process_txdone_queue()
762 fs_dprintk (FS_DEBUG_ALLOC, "Free trans-d: %p\n", td); in process_txdone_queue()
768 /* Action, I believe, is "don't do anything". -- REW */ in process_txdone_queue()
772 write_fs (dev, Q_RP(q->offset), Q_INCWRAP); in process_txdone_queue()
786 while (!((rq = read_fs (dev, Q_RP(q->offset))) & Q_EMPTY)) { in process_incoming()
791 qe->cmd, qe->p0, qe->p1, qe->p2); in process_incoming()
793 fs_dprintk (FS_DEBUG_QUEUE, "-> %x: %s\n", in process_incoming()
797 pe = bus_to_virt (qe->p0); in process_incoming()
798 fs_dprintk (FS_DEBUG_QUEUE, "Pool entry: %08x %08x %08x %08x %p %p.\n", in process_incoming()
799 pe->flags, pe->next, pe->bsa, pe->aal_bufsize, in process_incoming()
800 pe->skb, pe->fp); in process_incoming()
802 channo = qe->cmd & 0xffff; in process_incoming()
804 if (channo < dev->nchannels) in process_incoming()
805 atm_vcc = dev->atm_vccs[channo]; in process_incoming()
815 skb = pe->skb; in process_incoming()
816 pe->fp->n--; in process_incoming()
818 fs_dprintk (FS_DEBUG_QUEUE, "Got skb: %p\n", skb); in process_incoming()
819 if (FS_DEBUG_QUEUE & fs_debug) my_hd (bus_to_virt (pe->bsa), 0x20); in process_incoming()
821 skb_put (skb, qe->p1 & 0xffff); in process_incoming()
822 ATM_SKB(skb)->vcc = atm_vcc; in process_incoming()
823 atomic_inc(&atm_vcc->stats->rx); in process_incoming()
825 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-skb: %p (pushed)\n", skb); in process_incoming()
826 atm_vcc->push (atm_vcc, skb); in process_incoming()
827 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-d: %p\n", pe); in process_incoming()
830 printk (KERN_ERR "Got a receive on a non-open channel %d.\n", channo); in process_incoming()
834 has been consumed and needs to be processed. -- REW */ in process_incoming()
835 if (qe->p1 & 0xffff) { in process_incoming()
836 pe = bus_to_virt (qe->p0); in process_incoming()
837 pe->fp->n--; in process_incoming()
838 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-skb: %p\n", pe->skb); in process_incoming()
839 dev_kfree_skb_any (pe->skb); in process_incoming()
840 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-d: %p\n", pe); in process_incoming()
844 atomic_inc(&atm_vcc->stats->rx_drop); in process_incoming()
849 atomic_inc(&atm_vcc->stats->rx_drop); in process_incoming()
851 default: /* Hmm. Haven't written the code to handle the others yet... -- REW */ in process_incoming()
855 write_fs (dev, Q_RP(q->offset), Q_INCWRAP); in process_incoming()
861 #define DO_DIRECTION(tp) ((tp)->traffic_class != ATM_NONE)
866 struct fs_vcc *vcc; in fs_open() local
876 short vpi = atm_vcc->vpi; in fs_open()
877 int vci = atm_vcc->vci; in fs_open()
881 dev = FS_DEV(atm_vcc->dev); in fs_open()
882 fs_dprintk (FS_DEBUG_OPEN, "fs: open on dev: %p, vcc at %p\n", in fs_open()
886 set_bit(ATM_VF_ADDR, &atm_vcc->flags); in fs_open()
888 if ((atm_vcc->qos.aal != ATM_AAL5) && in fs_open()
889 (atm_vcc->qos.aal != ATM_AAL2)) in fs_open()
890 return -EINVAL; /* XXX AAL0 */ in fs_open()
893 atm_vcc->dev->number, atm_vcc->vpi, atm_vcc->vci); in fs_open()
897 vcc = kmalloc(sizeof(struct fs_vcc), GFP_KERNEL); in fs_open()
898 fs_dprintk (FS_DEBUG_ALLOC, "Alloc VCC: %p(%zd)\n", vcc, sizeof(struct fs_vcc)); in fs_open()
899 if (!vcc) { in fs_open()
900 clear_bit(ATM_VF_ADDR, &atm_vcc->flags); in fs_open()
901 return -ENOMEM; in fs_open()
904 atm_vcc->dev_data = vcc; in fs_open()
905 vcc->last_skb = NULL; in fs_open()
907 init_waitqueue_head (&vcc->close_wait); in fs_open()
909 txtp = &atm_vcc->qos.txtp; in fs_open()
910 rxtp = &atm_vcc->qos.rxtp; in fs_open()
912 if (!test_bit(ATM_VF_PARTIAL, &atm_vcc->flags)) { in fs_open()
915 for (to=33;to;to--, dev->channo++) { in fs_open()
917 if (dev->channo >= 32) in fs_open()
918 dev->channo = 0; in fs_open()
920 if (DO_DIRECTION(rxtp) && dev->atm_vccs[dev->channo]) in fs_open()
923 if (DO_DIRECTION(txtp) && test_bit (dev->channo, dev->tx_inuse)) in fs_open()
930 kfree(vcc); in fs_open()
931 return -EBUSY; in fs_open()
933 vcc->channo = dev->channo; in fs_open()
934 dev->channo &= dev->channel_mask; in fs_open()
937 vcc->channo = (vpi << FS155_VCI_BITS) | (vci); in fs_open()
938 if (((DO_DIRECTION(rxtp) && dev->atm_vccs[vcc->channo])) || in fs_open()
939 ( DO_DIRECTION(txtp) && test_bit (vcc->channo, dev->tx_inuse))) { in fs_open()
941 kfree(vcc); in fs_open()
942 return -EBUSY; in fs_open()
946 vcc->channo, vcc->channo); in fs_open()
951 fs_dprintk (FS_DEBUG_ALLOC, "Alloc tc: %p(%zd)\n", in fs_open()
955 kfree(vcc); in fs_open()
956 return -ENOMEM; in fs_open()
965 switch (atm_vcc->qos.aal) { in fs_open()
968 tc->flags = 0 in fs_open()
972 | TC_FLAGS_TYPE_UBR /* XXX Change to VBR -- PVDL */ in fs_open()
976 tc->flags = 0 in fs_open()
983 printk ("Unknown aal: %d\n", atm_vcc->qos.aal); in fs_open()
984 tc->flags = 0; in fs_open()
987 * chip makes odd errors if lower bits are set.... -- REW */ in fs_open()
988 tc->atm_hdr = (vpi << 20) | (vci << 4); in fs_open()
996 is round_down -- REW */ in fs_open()
1004 tmc0 = IS_FS50(dev)?0x61BE:0x64c9; /* Just copied over the bits from Fujitsu -- REW */ in fs_open()
1009 pcr = -pcr; in fs_open()
1016 kfree(vcc); in fs_open()
1023 tc->TMC[0] = tmc0 | 0x4000; in fs_open()
1024 tc->TMC[1] = 0; /* Unused */ in fs_open()
1025 tc->TMC[2] = 0; /* Unused */ in fs_open()
1026 tc->TMC[3] = 0; /* Unused */ in fs_open()
1028 tc->spec = 0; /* UTOPIA address, UDF, HEC: Unused -> 0 */ in fs_open()
1029 tc->rtag[0] = 0; /* What should I do with routing tags??? in fs_open()
1030 -- Not used -- AS -- Thanks -- REW*/ in fs_open()
1031 tc->rtag[1] = 0; in fs_open()
1032 tc->rtag[2] = 0; in fs_open()
1047 now. -- REW */ in fs_open()
1049 /* The command is IMMediate and INQueue. The parameters are out-of-line.. */ in fs_open()
1050 submit_command (dev, &dev->hp_txq, in fs_open()
1051 QE_CMD_CONFIG_TX | QE_CMD_IMM_INQ | vcc->channo, in fs_open()
1054 submit_command (dev, &dev->hp_txq, in fs_open()
1055 QE_CMD_TX_EN | QE_CMD_IMM_INQ | vcc->channo, in fs_open()
1057 set_bit (vcc->channo, dev->tx_inuse); in fs_open()
1061 dev->atm_vccs[vcc->channo] = atm_vcc; in fs_open()
1064 if (atm_vcc->qos.rxtp.max_sdu <= dev->rx_fp[bfp].bufsize) break; in fs_open()
1067 atm_vcc->qos.rxtp.max_sdu); in fs_open()
1068 /* XXX Cleanup? -- Would just calling fs_close work??? -- REW */ in fs_open()
1071 dev->atm_vccs[vcc->channo] = NULL; in fs_open()
1072 kfree (vcc); in fs_open()
1073 return -EINVAL; in fs_open()
1076 switch (atm_vcc->qos.aal) { in fs_open()
1079 submit_command (dev, &dev->hp_txq, in fs_open()
1080 QE_CMD_CONFIG_RX | QE_CMD_IMM_INQ | vcc->channo, in fs_open()
1086 submit_command (dev, &dev->hp_txq, in fs_open()
1087 QE_CMD_CONFIG_RX | QE_CMD_IMM_INQ | vcc->channo, in fs_open()
1094 submit_command (dev, &dev->hp_txq, in fs_open()
1096 0x80 + vcc->channo, in fs_open()
1097 (vpi << 16) | vci, 0 ); /* XXX -- Use defines. */ in fs_open()
1099 submit_command (dev, &dev->hp_txq, in fs_open()
1100 QE_CMD_RX_EN | QE_CMD_IMM_INQ | vcc->channo, in fs_open()
1105 set_bit(ATM_VF_READY, &atm_vcc->flags); in fs_open()
1114 struct fs_dev *dev = FS_DEV (atm_vcc->dev); in fs_close()
1115 struct fs_vcc *vcc = FS_VCC (atm_vcc); in fs_close() local
1121 clear_bit(ATM_VF_READY, &atm_vcc->flags); in fs_close()
1123 fs_dprintk (FS_DEBUG_QSIZE, "--==**[%d]**==--", dev->ntxpckts); in fs_close()
1124 if (vcc->last_skb) { in fs_close()
1125 fs_dprintk (FS_DEBUG_QUEUE, "Waiting for skb %p to be sent.\n", in fs_close()
1126 vcc->last_skb); in fs_close()
1133 is taking too long. Maybe just use non-interruptible sleep on? -- REW */ in fs_close()
1134 wait_event_interruptible(vcc->close_wait, !vcc->last_skb); in fs_close()
1137 txtp = &atm_vcc->qos.txtp; in fs_close()
1138 rxtp = &atm_vcc->qos.rxtp; in fs_close()
1142 removal of the "CMD_IMM_INQ" part of the TX_PURGE_INH... -- REW */ in fs_close()
1145 submit_command (dev, &dev->hp_txq, in fs_close()
1146 QE_CMD_TX_PURGE_INH | /*QE_CMD_IMM_INQ|*/ vcc->channo, 0,0,0); in fs_close()
1147 clear_bit (vcc->channo, dev->tx_inuse); in fs_close()
1151 submit_command (dev, &dev->hp_txq, in fs_close()
1152 QE_CMD_RX_PURGE_INH | QE_CMD_IMM_INQ | vcc->channo, 0,0,0); in fs_close()
1153 dev->atm_vccs [vcc->channo] = NULL; in fs_close()
1158 channel? -- REW. Yes it is. -- Hang. Ok. I'll use -1 in fs_close()
1159 (0xfff...) -- REW */ in fs_close()
1160 submit_command (dev, &dev->hp_txq, in fs_close()
1162 0x80 + vcc->channo, -1, 0 ); in fs_close()
1166 fs_dprintk (FS_DEBUG_ALLOC, "Free vcc: %p\n", vcc); in fs_close()
1167 kfree (vcc); in fs_close()
1175 struct fs_dev *dev = FS_DEV (atm_vcc->dev); in fs_send()
1176 struct fs_vcc *vcc = FS_VCC (atm_vcc); in fs_send() local
1182 fs_dprintk (FS_DEBUG_SEND, "Send: atm_vcc %p skb %p vcc %p dev %p\n", in fs_send()
1183 atm_vcc, skb, vcc, dev); in fs_send()
1185 fs_dprintk (FS_DEBUG_ALLOC, "Alloc t-skb: %p (atm_send)\n", skb); in fs_send()
1187 ATM_SKB(skb)->vcc = atm_vcc; in fs_send()
1189 vcc->last_skb = skb; in fs_send()
1192 fs_dprintk (FS_DEBUG_ALLOC, "Alloc transd: %p(%zd)\n", td, sizeof (struct FS_BPENTRY)); in fs_send()
1195 return -ENOMEM; in fs_send()
1199 *(int *) skb->data); in fs_send()
1201 td->flags = TD_EPI | TD_DATA | skb->len; in fs_send()
1202 td->next = 0; in fs_send()
1203 td->bsa = virt_to_bus (skb->data); in fs_send()
1204 td->skb = skb; in fs_send()
1205 td->dev = dev; in fs_send()
1206 dev->ntxpckts++; in fs_send()
1210 dq[qd].flags = td->flags; in fs_send()
1211 dq[qd].next = td->next; in fs_send()
1212 dq[qd].bsa = td->bsa; in fs_send()
1213 dq[qd].skb = td->skb; in fs_send()
1214 dq[qd].dev = td->dev; in fs_send()
1219 submit_queue (dev, &dev->hp_txq, in fs_send()
1220 QE_TRANSMIT_DE | vcc->channo, in fs_send()
1225 read_fs (dev, Q_EA (dev->hp_txq.offset)) - in fs_send()
1226 read_fs (dev, Q_SA (dev->hp_txq.offset)), in fs_send()
1227 read_fs (dev, Q_EA (dev->tx_relq.offset)) - in fs_send()
1228 read_fs (dev, Q_SA (dev->tx_relq.offset))); in fs_send()
1242 return -ENOIOCTLCMD;
1246 static int fs_getsockopt(struct atm_vcc *vcc,int level,int optname,
1255 static int fs_setsockopt(struct atm_vcc *vcc,int level,int optname,
1280 static int fs_change_qos(struct atm_vcc *vcc,struct atm_qos *qos,int flags)
1332 submit_command (dev, &dev->hp_txq, QE_CMD_PRP_WR | QE_CMD_IMM_INQ, in write_phy()
1341 while (reginit->reg != PHY_EOF) { in init_phy()
1342 if (reginit->reg == PHY_CLEARALL) { in init_phy()
1344 for (i=0;i<reginit->val;i++) { in init_phy()
1348 write_phy (dev, reginit->reg, reginit->val); in init_phy()
1377 NOT documented that way in the Windows driver. -- REW */ in reset_chip()
1379 the init sequence. However, a small hardware-feature, will in reset_chip()
1382 number. -- REW */ in reset_chip()
1387 write_fs (dev, 0x200 + i * 4, -1); in reset_chip()
1398 if ((unsigned long)t & (alignment-1)) { in aligned_kmalloc()
1399 printk ("Kmalloc doesn't align things correctly! %p\n", t); in aligned_kmalloc()
1413 struct FS_QENTRY *p; in init_q() local
1420 p = aligned_kmalloc (sz, GFP_KERNEL, 0x10); in init_q()
1421 fs_dprintk (FS_DEBUG_ALLOC, "Alloc queue: %p(%d)\n", p, sz); in init_q()
1423 if (!p) return 0; in init_q()
1425 write_fs (dev, Q_SA(queue), virt_to_bus(p)); in init_q()
1426 write_fs (dev, Q_EA(queue), virt_to_bus(p+nentries-1)); in init_q()
1427 write_fs (dev, Q_WP(queue), virt_to_bus(p)); in init_q()
1428 write_fs (dev, Q_RP(queue), virt_to_bus(p)); in init_q()
1431 no pre-warning to empty queues: We do our best to keep the in init_q()
1436 txq->sa = p; in init_q()
1437 txq->ea = p; in init_q()
1438 txq->offset = queue; in init_q()
1458 fp->offset = queue; in init_fp()
1459 fp->bufsize = bufsize; in init_fp()
1460 fp->nr_buffers = nr_buffers; in init_fp()
1471 return read_fs (dev, FP_CNT (fp->offset)); in nr_buffers_in_freepool()
1473 return fp->n; in nr_buffers_in_freepool()
1478 /* Check if this gets going again if a pool ever runs out. -- Yes, it
1480 working again after that... -- REW */
1490 fs_dprintk (FS_DEBUG_QUEUE, "Topping off queue at %x (%d-%d/%d)\n", in top_off_fp()
1491 fp->offset, read_fs (dev, FP_CNT (fp->offset)), fp->n, in top_off_fp()
1492 fp->nr_buffers); in top_off_fp()
1493 while (nr_buffers_in_freepool(dev, fp) < fp->nr_buffers) { in top_off_fp()
1495 skb = alloc_skb (fp->bufsize, gfp_flags); in top_off_fp()
1496 fs_dprintk (FS_DEBUG_ALLOC, "Alloc rec-skb: %p(%d)\n", skb, fp->bufsize); in top_off_fp()
1499 fs_dprintk (FS_DEBUG_ALLOC, "Alloc rec-d: %p(%zd)\n", ne, sizeof (struct FS_BPENTRY)); in top_off_fp()
1501 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-skb: %p\n", skb); in top_off_fp()
1506 fs_dprintk (FS_DEBUG_QUEUE, "Adding skb %p desc %p -> %p(%p) ", in top_off_fp()
1507 skb, ne, skb->data, skb->head); in top_off_fp()
1509 ne->flags = FP_FLAGS_EPI | fp->bufsize; in top_off_fp()
1510 ne->next = virt_to_bus (NULL); in top_off_fp()
1511 ne->bsa = virt_to_bus (skb->data); in top_off_fp()
1512 ne->aal_bufsize = fp->bufsize; in top_off_fp()
1513 ne->skb = skb; in top_off_fp()
1514 ne->fp = fp; in top_off_fp()
1518 * machine pointers (could be 64-bit) into a in top_off_fp()
1519 * 32-bit register. in top_off_fp()
1522 qe_tmp = read_fs (dev, FP_EA(fp->offset)); in top_off_fp()
1526 qe->next = virt_to_bus(ne); in top_off_fp()
1527 qe->flags &= ~FP_FLAGS_EPI; in top_off_fp()
1529 write_fs (dev, FP_SA(fp->offset), virt_to_bus(ne)); in top_off_fp()
1531 write_fs (dev, FP_EA(fp->offset), virt_to_bus (ne)); in top_off_fp()
1532 fp->n++; /* XXX Atomic_inc? */ in top_off_fp()
1533 write_fs (dev, FP_CTU(fp->offset), 1); in top_off_fp()
1543 write_fs (dev, Q_SA(txq->offset), 0); in free_queue()
1544 write_fs (dev, Q_EA(txq->offset), 0); in free_queue()
1545 write_fs (dev, Q_RP(txq->offset), 0); in free_queue()
1546 write_fs (dev, Q_WP(txq->offset), 0); in free_queue()
1549 fs_dprintk (FS_DEBUG_ALLOC, "Free queue: %p\n", txq->sa); in free_queue()
1550 kfree (txq->sa); in free_queue()
1559 write_fs (dev, FP_CNF(fp->offset), 0); in free_freepool()
1560 write_fs (dev, FP_SA (fp->offset), 0); in free_freepool()
1561 write_fs (dev, FP_EA (fp->offset), 0); in free_freepool()
1562 write_fs (dev, FP_CNT(fp->offset), 0); in free_freepool()
1563 write_fs (dev, FP_CTU(fp->offset), 0); in free_freepool()
1583 /* Aaargh! I'm ashamed. This costs more lines-of-code than the actual in fs_irq()
1584 interrupt routine!. (Well, used to when I wrote that comment) -- REW */ in fs_irq()
1591 free_irq (dev->irq, dev_id); in fs_irq()
1593 dev->irq); in fs_irq()
1602 read_fs (dev, Q_EA (dev->hp_txq.offset)) - in fs_irq()
1603 read_fs (dev, Q_SA (dev->hp_txq.offset)), in fs_irq()
1604 read_fs (dev, Q_EA (dev->tx_relq.offset)) - in fs_irq()
1605 read_fs (dev, Q_SA (dev->tx_relq.offset))); in fs_irq()
1619 fs_dprintk (FS_DEBUG_IRQ, "Iiiin-coming (0)!!!!\n"); in fs_irq()
1620 process_incoming (dev, &dev->rx_rq[0]); in fs_irq()
1622 top_off_fp (dev, &dev->rx_fp[0], GFP_ATOMIC); in fs_irq()
1623 top_off_fp (dev, &dev->rx_fp[1], GFP_ATOMIC); in fs_irq()
1627 fs_dprintk (FS_DEBUG_IRQ, "Iiiin-coming (1)!!!!\n"); in fs_irq()
1628 process_incoming (dev, &dev->rx_rq[1]); in fs_irq()
1629 top_off_fp (dev, &dev->rx_fp[2], GFP_ATOMIC); in fs_irq()
1630 top_off_fp (dev, &dev->rx_fp[3], GFP_ATOMIC); in fs_irq()
1634 fs_dprintk (FS_DEBUG_IRQ, "Iiiin-coming (2)!!!!\n"); in fs_irq()
1635 process_incoming (dev, &dev->rx_rq[2]); in fs_irq()
1636 top_off_fp (dev, &dev->rx_fp[4], GFP_ATOMIC); in fs_irq()
1637 top_off_fp (dev, &dev->rx_fp[5], GFP_ATOMIC); in fs_irq()
1641 fs_dprintk (FS_DEBUG_IRQ, "Iiiin-coming (3)!!!!\n"); in fs_irq()
1642 process_incoming (dev, &dev->rx_rq[3]); in fs_irq()
1643 top_off_fp (dev, &dev->rx_fp[6], GFP_ATOMIC); in fs_irq()
1644 top_off_fp (dev, &dev->rx_fp[7], GFP_ATOMIC); in fs_irq()
1649 process_return_queue (dev, &dev->st_q); in fs_irq()
1654 process_txdone_queue (dev, &dev->tx_relq); in fs_irq()
1668 dev->timer.expires = jiffies + FS_POLL_FREQ; in fs_poll()
1669 add_timer (&dev->timer); in fs_poll()
1680 pci_dev = dev->pci_dev; in fs_init()
1685 dev->pci_dev->irq); in fs_init()
1692 dev->hw_base = pci_resource_start(pci_dev, 0); in fs_init()
1694 dev->base = ioremap(dev->hw_base, 0x1000); in fs_init()
1717 while (--to) { in fs_init()
1740 dev->channel_mask = 0x1f; in fs_init()
1741 dev->channo = 0; in fs_init()
1779 * performance jumped 50->70... */ in fs_init()
1786 dev->atm_dev->ci_range.vpi_bits = 12; in fs_init()
1787 dev->atm_dev->ci_range.vci_bits = 16; in fs_init()
1788 dev->nchannels = FS50_NR_CHANNELS; in fs_init()
1791 | (((1 << FS155_VPI_BITS) - 1) * RAS0_VPSEL) in fs_init()
1792 | (((1 << FS155_VCI_BITS) - 1) * RAS0_VCSEL)); in fs_init()
1795 dev->atm_dev->ci_range.vpi_bits = FS155_VPI_BITS; in fs_init()
1796 dev->atm_dev->ci_range.vci_bits = FS155_VCI_BITS; in fs_init()
1805 write_fs (dev, RAM, (1 << (28 - FS155_VPI_BITS - FS155_VCI_BITS)) - 1); in fs_init()
1806 dev->nchannels = FS155_NR_CHANNELS; in fs_init()
1808 dev->atm_vccs = kcalloc (dev->nchannels, sizeof (struct atm_vcc *), in fs_init()
1810 fs_dprintk (FS_DEBUG_ALLOC, "Alloc atmvccs: %p(%zd)\n", in fs_init()
1811 dev->atm_vccs, dev->nchannels * sizeof (struct atm_vcc *)); in fs_init()
1813 if (!dev->atm_vccs) { in fs_init()
1814 printk (KERN_WARNING "Couldn't allocate memory for VCC buffers. Woops!\n"); in fs_init()
1819 dev->tx_inuse = kzalloc (dev->nchannels / 8 /* bits/byte */ , GFP_KERNEL); in fs_init()
1820 fs_dprintk (FS_DEBUG_ALLOC, "Alloc tx_inuse: %p(%d)\n", in fs_init()
1821 dev->atm_vccs, dev->nchannels / 8); in fs_init()
1823 if (!dev->tx_inuse) { in fs_init()
1828 /* -- RAS1 : FS155 and 50 differ. Default (0) should be OK for both */ in fs_init()
1829 /* -- RAS2 : FS50 only: Default is OK. */ in fs_init()
1831 /* DMAMODE, default should be OK. -- REW */ in fs_init()
1834 init_q (dev, &dev->hp_txq, TX_PQ(TXQ_HP), TXQ_NENTRIES, 0); in fs_init()
1835 init_q (dev, &dev->lp_txq, TX_PQ(TXQ_LP), TXQ_NENTRIES, 0); in fs_init()
1836 init_q (dev, &dev->tx_relq, TXB_RQ, TXQ_NENTRIES, 1); in fs_init()
1837 init_q (dev, &dev->st_q, ST_Q, TXQ_NENTRIES, 1); in fs_init()
1840 init_fp (dev, &dev->rx_fp[i], RXB_FP(i), in fs_init()
1842 top_off_fp (dev, &dev->rx_fp[i], GFP_KERNEL); in fs_init()
1847 init_q (dev, &dev->rx_rq[i], RXB_RQ(i), RXRQ_NENTRIES, 1); in fs_init()
1849 dev->irq = pci_dev->irq; in fs_init()
1850 if (request_irq (dev->irq, fs_irq, IRQF_SHARED, "firestream", dev)) { in fs_init()
1851 printk (KERN_WARNING "couldn't get irq %d for firestream.\n", pci_dev->irq); in fs_init()
1855 fs_dprintk (FS_DEBUG_INIT, "Grabbed irq %d for dev at %p.\n", dev->irq, dev); in fs_init()
1892 timer_setup(&dev->timer, fs_poll, 0); in fs_init()
1893 dev->timer.expires = jiffies + FS_POLL_FREQ; in fs_init()
1894 add_timer (&dev->timer); in fs_init()
1897 dev->atm_dev->dev_data = dev; in fs_init()
1902 iounmap(dev->base); in fs_init()
1916 fs_dprintk (FS_DEBUG_ALLOC, "Alloc fs-dev: %p(%zd)\n", in firestream_init_one()
1920 atm_dev = atm_dev_register("fs", &pci_dev->dev, &ops, -1, NULL); in firestream_init_one()
1924 fs_dev->pci_dev = pci_dev; in firestream_init_one()
1925 fs_dev->atm_dev = atm_dev; in firestream_init_one()
1926 fs_dev->flags = ent->driver_data; in firestream_init_one()
1931 fs_dev->next = fs_boards; in firestream_init_one()
1940 return -ENODEV; in firestream_init_one()
1947 struct fs_vcc *vcc; in firestream_remove_one() local
1963 printk ("%d: %p: %08x %08x %p %p\n", in firestream_remove_one()
1971 fs_dprintk (FS_DEBUG_CLEANUP, "Releasing resources for dev at %p.\n", dev); in firestream_remove_one()
1975 for (i=0;i < dev->nchannels;i++) { in firestream_remove_one()
1976 if (dev->atm_vccs[i]) { in firestream_remove_one()
1977 vcc = FS_VCC (dev->atm_vccs[i]); in firestream_remove_one()
1978 submit_command (dev, &dev->hp_txq, in firestream_remove_one()
1979 QE_CMD_TX_PURGE_INH | QE_CMD_IMM_INQ | vcc->channo, 0,0,0); in firestream_remove_one()
1980 submit_command (dev, &dev->hp_txq, in firestream_remove_one()
1981 QE_CMD_RX_PURGE_INH | QE_CMD_IMM_INQ | vcc->channo, 0,0,0); in firestream_remove_one()
1989 for (fp=bus_to_virt (read_fs (dev, FP_SA(dev->rx_fp[i].offset))); in firestream_remove_one()
1990 !(fp->flags & FP_FLAGS_EPI);fp = nxt) { in firestream_remove_one()
1991 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-skb: %p\n", fp->skb); in firestream_remove_one()
1992 dev_kfree_skb_any (fp->skb); in firestream_remove_one()
1993 nxt = bus_to_virt (fp->next); in firestream_remove_one()
1994 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-d: %p\n", fp); in firestream_remove_one()
1997 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-skb: %p\n", fp->skb); in firestream_remove_one()
1998 dev_kfree_skb_any (fp->skb); in firestream_remove_one()
1999 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-d: %p\n", fp); in firestream_remove_one()
2007 fs_dprintk (FS_DEBUG_CLEANUP, "Freeing irq%d.\n", dev->irq); in firestream_remove_one()
2008 free_irq (dev->irq, dev); in firestream_remove_one()
2009 del_timer_sync (&dev->timer); in firestream_remove_one()
2011 atm_dev_deregister(dev->atm_dev); in firestream_remove_one()
2012 free_queue (dev, &dev->hp_txq); in firestream_remove_one()
2013 free_queue (dev, &dev->lp_txq); in firestream_remove_one()
2014 free_queue (dev, &dev->tx_relq); in firestream_remove_one()
2015 free_queue (dev, &dev->st_q); in firestream_remove_one()
2017 fs_dprintk (FS_DEBUG_ALLOC, "Free atmvccs: %p\n", dev->atm_vccs); in firestream_remove_one()
2018 kfree (dev->atm_vccs); in firestream_remove_one()
2021 free_freepool (dev, &dev->rx_fp[i]); in firestream_remove_one()
2024 free_queue (dev, &dev->rx_rq[i]); in firestream_remove_one()
2026 iounmap(dev->base); in firestream_remove_one()
2027 fs_dprintk (FS_DEBUG_ALLOC, "Free fs-dev: %p\n", dev); in firestream_remove_one()
2028 nxtdev = dev->next; in firestream_remove_one()