Lines Matching +full:vcc +full:- +full:p
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 /* drivers/atm/firestream.c - FireStream 155 (MB86697) and
9 * and ambassador.c Copyright (C) 1995-1999 Madge Networks Ltd
52 * pays to have those pre-allocated. Unfortunately, we can't fully
56 * smaller buffers more efficiently than the larger ones. -- REW
61 * from 1024-byte regions anyway. With the size of the sk_buffs (quite
62 * large), it doesn't pay to allocate the smallest size (64) -- REW */
65 * are appreciated. -- REW */
69 * would be interpreted. -- REW */
103 - When disabling channels, write an invalid VP/VC value to the
109 - Don't initialize the match registers to 0, as 0.0 is a valid
117 "interrupt-traffic" for the CPU. This driver requests an interrupt on EVERY
120 Besides that, the userspace->kernel copy and the PCI bus are the
129 -- REW
169 "reserved 30", /* FIXME: The strings between 30-40 might be wrong. */
174 "low priority discard - no receive descriptor",
175 "low priority discard - missing end of packet",
236 #define PHY_EOF -1
237 #define PHY_CLEARALL -2
255 { PHY_EOF, 0}, /* -1 signals end of list */
264 anyway. We therefore have to disable this for production. -- REW */
268 that great without interrupts. -- REW */
274 aid in debugging in the field, I'm leaving the compile-time debug
277 them to recompile... -- REW
292 if you get this with the debug default not set to zero again. -- REW */
305 /* XXX Add rx_buf_sizes, and rx_pool_sizes As per request Amar. -- REW */
338 printk ("%p ", ptr); in my_hd()
351 len -= 16; in my_hd()
361 * I copied it over from the ambassador driver. -- REW */
365 if (ATM_SKB(skb)->vcc->pop) in fs_kfree_skb()
366 ATM_SKB(skb)->vcc->pop (ATM_SKB(skb)->vcc, skb); in fs_kfree_skb()
378 * here and the ambassador driver) -- REW
398 e--;
401 // Now the mantissa is in positions bit 16-25. Excepf for the "hidden 1" that's in bit 26.
409 14 lines-of-code. Compare that with the 120 that the Ambassador
419 for (;!(rate & 0xfe000000);rate <<= 1, e--);
423 Exercise for the reader: Remove one more line-of-code, without
426 manage to lose two lines or more, keep me updated! ;-)
428 -- REW */
439 unsigned char exp = -1; /* hush gcc */ in make_rate()
440 unsigned int man = -1; /* hush gcc */ in make_rate()
444 /* rates in cells per second, ITU format (nasty 16-bit floating-point) in make_rate()
445 given 5-bit e and 9-bit m: in make_rate()
448 (bit 15 is "reserved", bit 14 "non-zero") in make_rate()
450 largest rate is (1+511/512)*2^31 = 4290772992 (< 2^32-1) in make_rate()
451 smallest non-zero rate is (1+0/512)*2^0 = 1 (> 0) in make_rate()
454 remove top bit and shift (rounding if feeling clever) by 9-e in make_rate()
458 when properly merged. -- REW */ in make_rate()
464 return -EINVAL; in make_rate()
476 /* invariant: rate = man*2^(exp-31) */ in make_rate()
478 exp = exp - 1; in make_rate()
483 rate = (2^31+(man-2^31))*2^(exp-31) in make_rate()
484 rate = (1+(man-2^31)/2^31)*2^exp in make_rate()
487 man &= 0xffffffffU; /* a nop on 32-bit systems */ in make_rate()
490 exp is in the range 0 to 31, man is in the range 0 to 2^32-1 in make_rate()
491 time to lose significance... we want m in the range 0 to 2^9-1 in make_rate()
500 man = man>>(32-9); in make_rate()
506 man = (man>>(32-9)) + 1; in make_rate()
513 man = (man>>(32-9)); in make_rate()
519 if (man & (1<<(32-9-1))) { in make_rate()
520 man = (man>>(32-9)) + 1; in make_rate()
527 man = (man>>(32-9)); in make_rate()
534 /* zero rate - not representable */ in make_rate()
537 return -EINVAL; in make_rate()
551 ? (1 << exp) + (man << (exp-9)) in make_rate()
552 : (1 << exp) + ((man + (1<<(9-exp-1))) >> (9-exp)); in make_rate()
561 /* For DEEP-DOWN debugging these can be rigged to intercept accesses to
566 writel (val, dev->base + offset); in write_fs()
572 return readl (dev->base + offset); in read_fs()
579 return bus_to_virt (read_fs (dev, Q_WP(q->offset)) & Q_ADDR_MASK); in get_qentry()
589 still the same as the value passed as qe... -- REW */ in submit_qentry()
591 while ((wp = read_fs (dev, Q_WP (q->offset))) & Q_FULL) { in submit_qentry()
593 q->offset); in submit_qentry()
600 fs_dprintk (FS_DEBUG_TXQ, "q mismatch! %p %p\n", qe, cqe); in submit_qentry()
603 write_fs (dev, Q_WP(q->offset), Q_INCWRAP); in submit_qentry()
610 rp = read_fs (dev, Q_RP(q->offset)); in submit_qentry()
611 wp = read_fs (dev, Q_WP(q->offset)); in submit_qentry()
612 fs_dprintk (FS_DEBUG_TXQ, "q at %d: %x-%x: %x entries.\n", in submit_qentry()
613 q->offset, rp, wp, wp-rp); in submit_qentry()
633 qe->cmd = cmd; in submit_queue()
634 qe->p0 = p1; in submit_queue()
635 qe->p1 = p2; in submit_queue()
636 qe->p2 = p3; in submit_queue()
649 /* Test the "other" way one day... -- REW */
672 while (!((rq = read_fs (dev, Q_RP(q->offset))) & Q_EMPTY)) { in process_return_queue()
677 qe->cmd, qe->p0, qe->p1, qe->p2, STATUS_CODE (qe)); in process_return_queue()
681 tc = bus_to_virt (qe->p0); in process_return_queue()
682 fs_dprintk (FS_DEBUG_ALLOC, "Free tc: %p\n", tc); in process_return_queue()
687 write_fs (dev, Q_RP(q->offset), Q_INCWRAP); in process_return_queue()
700 while (!((rq = read_fs (dev, Q_RP(q->offset))) & Q_EMPTY)) { in process_txdone_queue()
705 qe->cmd, qe->p0, qe->p1, qe->p2, STATUS_CODE (qe)); in process_txdone_queue()
709 qe->cmd, qe->p0, qe->p1, qe->p2, STATUS_CODE (qe)); in process_txdone_queue()
717 tmp = qe->p0; in process_txdone_queue()
723 fs_dprintk (FS_DEBUG_QUEUE, "Pool entry: %08x %08x %08x %08x %p.\n", in process_txdone_queue()
724 td->flags, td->next, td->bsa, td->aal_bufsize, td->skb ); in process_txdone_queue()
726 skb = td->skb; in process_txdone_queue()
727 if (skb == FS_VCC (ATM_SKB(skb)->vcc)->last_skb) { in process_txdone_queue()
728 FS_VCC (ATM_SKB(skb)->vcc)->last_skb = NULL; in process_txdone_queue()
729 wake_up_interruptible (& FS_VCC (ATM_SKB(skb)->vcc)->close_wait); in process_txdone_queue()
731 td->dev->ntxpckts--; in process_txdone_queue()
737 fs_dprintk (FS_DEBUG_QSIZE, "[%d]", td->dev->ntxpckts); in process_txdone_queue()
741 atomic_inc(&ATM_SKB(skb)->vcc->stats->tx); in process_txdone_queue()
744 fs_dprintk (FS_DEBUG_ALLOC, "Free t-skb: %p\n", skb); in process_txdone_queue()
747 fs_dprintk (FS_DEBUG_ALLOC, "Free trans-d: %p\n", td); in process_txdone_queue()
753 /* Action, I believe, is "don't do anything". -- REW */ in process_txdone_queue()
757 write_fs (dev, Q_RP(q->offset), Q_INCWRAP); in process_txdone_queue()
771 while (!((rq = read_fs (dev, Q_RP(q->offset))) & Q_EMPTY)) { in process_incoming()
776 qe->cmd, qe->p0, qe->p1, qe->p2); in process_incoming()
778 fs_dprintk (FS_DEBUG_QUEUE, "-> %x: %s\n", in process_incoming()
782 pe = bus_to_virt (qe->p0); in process_incoming()
783 fs_dprintk (FS_DEBUG_QUEUE, "Pool entry: %08x %08x %08x %08x %p %p.\n", in process_incoming()
784 pe->flags, pe->next, pe->bsa, pe->aal_bufsize, in process_incoming()
785 pe->skb, pe->fp); in process_incoming()
787 channo = qe->cmd & 0xffff; in process_incoming()
789 if (channo < dev->nchannels) in process_incoming()
790 atm_vcc = dev->atm_vccs[channo]; in process_incoming()
800 skb = pe->skb; in process_incoming()
801 pe->fp->n--; in process_incoming()
803 fs_dprintk (FS_DEBUG_QUEUE, "Got skb: %p\n", skb); in process_incoming()
804 if (FS_DEBUG_QUEUE & fs_debug) my_hd (bus_to_virt (pe->bsa), 0x20); in process_incoming()
806 skb_put (skb, qe->p1 & 0xffff); in process_incoming()
807 ATM_SKB(skb)->vcc = atm_vcc; in process_incoming()
808 atomic_inc(&atm_vcc->stats->rx); in process_incoming()
810 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-skb: %p (pushed)\n", skb); in process_incoming()
811 atm_vcc->push (atm_vcc, skb); in process_incoming()
812 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-d: %p\n", pe); in process_incoming()
815 printk (KERN_ERR "Got a receive on a non-open channel %d.\n", channo); in process_incoming()
819 has been consumed and needs to be processed. -- REW */ in process_incoming()
820 if (qe->p1 & 0xffff) { in process_incoming()
821 pe = bus_to_virt (qe->p0); in process_incoming()
822 pe->fp->n--; in process_incoming()
823 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-skb: %p\n", pe->skb); in process_incoming()
824 dev_kfree_skb_any (pe->skb); in process_incoming()
825 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-d: %p\n", pe); in process_incoming()
829 atomic_inc(&atm_vcc->stats->rx_drop); in process_incoming()
834 atomic_inc(&atm_vcc->stats->rx_drop); in process_incoming()
836 default: /* Hmm. Haven't written the code to handle the others yet... -- REW */ in process_incoming()
840 write_fs (dev, Q_RP(q->offset), Q_INCWRAP); in process_incoming()
846 #define DO_DIRECTION(tp) ((tp)->traffic_class != ATM_NONE)
851 struct fs_vcc *vcc; in fs_open() local
861 short vpi = atm_vcc->vpi; in fs_open()
862 int vci = atm_vcc->vci; in fs_open()
866 dev = FS_DEV(atm_vcc->dev); in fs_open()
867 fs_dprintk (FS_DEBUG_OPEN, "fs: open on dev: %p, vcc at %p\n", in fs_open()
871 set_bit(ATM_VF_ADDR, &atm_vcc->flags); in fs_open()
873 if ((atm_vcc->qos.aal != ATM_AAL5) && in fs_open()
874 (atm_vcc->qos.aal != ATM_AAL2)) in fs_open()
875 return -EINVAL; /* XXX AAL0 */ in fs_open()
878 atm_vcc->dev->number, atm_vcc->vpi, atm_vcc->vci); in fs_open()
882 vcc = kmalloc(sizeof(struct fs_vcc), GFP_KERNEL); in fs_open()
883 fs_dprintk (FS_DEBUG_ALLOC, "Alloc VCC: %p(%zd)\n", vcc, sizeof(struct fs_vcc)); in fs_open()
884 if (!vcc) { in fs_open()
885 clear_bit(ATM_VF_ADDR, &atm_vcc->flags); in fs_open()
886 return -ENOMEM; in fs_open()
889 atm_vcc->dev_data = vcc; in fs_open()
890 vcc->last_skb = NULL; in fs_open()
892 init_waitqueue_head (&vcc->close_wait); in fs_open()
894 txtp = &atm_vcc->qos.txtp; in fs_open()
895 rxtp = &atm_vcc->qos.rxtp; in fs_open()
897 if (!test_bit(ATM_VF_PARTIAL, &atm_vcc->flags)) { in fs_open()
900 for (to=33;to;to--, dev->channo++) { in fs_open()
902 if (dev->channo >= 32) in fs_open()
903 dev->channo = 0; in fs_open()
905 if (DO_DIRECTION(rxtp) && dev->atm_vccs[dev->channo]) in fs_open()
908 if (DO_DIRECTION(txtp) && test_bit (dev->channo, dev->tx_inuse)) in fs_open()
915 kfree(vcc); in fs_open()
916 return -EBUSY; in fs_open()
918 vcc->channo = dev->channo; in fs_open()
919 dev->channo &= dev->channel_mask; in fs_open()
922 vcc->channo = (vpi << FS155_VCI_BITS) | (vci); in fs_open()
923 if (((DO_DIRECTION(rxtp) && dev->atm_vccs[vcc->channo])) || in fs_open()
924 ( DO_DIRECTION(txtp) && test_bit (vcc->channo, dev->tx_inuse))) { in fs_open()
926 kfree(vcc); in fs_open()
927 return -EBUSY; in fs_open()
931 vcc->channo, vcc->channo); in fs_open()
936 fs_dprintk (FS_DEBUG_ALLOC, "Alloc tc: %p(%zd)\n", in fs_open()
940 kfree(vcc); in fs_open()
941 return -ENOMEM; in fs_open()
950 switch (atm_vcc->qos.aal) { in fs_open()
953 tc->flags = 0 in fs_open()
957 | TC_FLAGS_TYPE_UBR /* XXX Change to VBR -- PVDL */ in fs_open()
961 tc->flags = 0 in fs_open()
968 printk ("Unknown aal: %d\n", atm_vcc->qos.aal); in fs_open()
969 tc->flags = 0; in fs_open()
972 * chip makes odd errors if lower bits are set.... -- REW */ in fs_open()
973 tc->atm_hdr = (vpi << 20) | (vci << 4); in fs_open()
981 is round_down -- REW */ in fs_open()
989 tmc0 = IS_FS50(dev)?0x61BE:0x64c9; /* Just copied over the bits from Fujitsu -- REW */ in fs_open()
994 pcr = -pcr; in fs_open()
1001 kfree(vcc); in fs_open()
1008 tc->TMC[0] = tmc0 | 0x4000; in fs_open()
1009 tc->TMC[1] = 0; /* Unused */ in fs_open()
1010 tc->TMC[2] = 0; /* Unused */ in fs_open()
1011 tc->TMC[3] = 0; /* Unused */ in fs_open()
1013 tc->spec = 0; /* UTOPIA address, UDF, HEC: Unused -> 0 */ in fs_open()
1014 tc->rtag[0] = 0; /* What should I do with routing tags??? in fs_open()
1015 -- Not used -- AS -- Thanks -- REW*/ in fs_open()
1016 tc->rtag[1] = 0; in fs_open()
1017 tc->rtag[2] = 0; in fs_open()
1032 now. -- REW */ in fs_open()
1034 /* The command is IMMediate and INQueue. The parameters are out-of-line.. */ in fs_open()
1035 submit_command (dev, &dev->hp_txq, in fs_open()
1036 QE_CMD_CONFIG_TX | QE_CMD_IMM_INQ | vcc->channo, in fs_open()
1039 submit_command (dev, &dev->hp_txq, in fs_open()
1040 QE_CMD_TX_EN | QE_CMD_IMM_INQ | vcc->channo, in fs_open()
1042 set_bit (vcc->channo, dev->tx_inuse); in fs_open()
1046 dev->atm_vccs[vcc->channo] = atm_vcc; in fs_open()
1049 if (atm_vcc->qos.rxtp.max_sdu <= dev->rx_fp[bfp].bufsize) break; in fs_open()
1052 atm_vcc->qos.rxtp.max_sdu); in fs_open()
1053 /* XXX Cleanup? -- Would just calling fs_close work??? -- REW */ in fs_open()
1056 dev->atm_vccs[vcc->channo] = NULL; in fs_open()
1057 kfree (vcc); in fs_open()
1058 return -EINVAL; in fs_open()
1061 switch (atm_vcc->qos.aal) { in fs_open()
1064 submit_command (dev, &dev->hp_txq, in fs_open()
1065 QE_CMD_CONFIG_RX | QE_CMD_IMM_INQ | vcc->channo, in fs_open()
1071 submit_command (dev, &dev->hp_txq, in fs_open()
1072 QE_CMD_CONFIG_RX | QE_CMD_IMM_INQ | vcc->channo, in fs_open()
1079 submit_command (dev, &dev->hp_txq, in fs_open()
1081 0x80 + vcc->channo, in fs_open()
1082 (vpi << 16) | vci, 0 ); /* XXX -- Use defines. */ in fs_open()
1084 submit_command (dev, &dev->hp_txq, in fs_open()
1085 QE_CMD_RX_EN | QE_CMD_IMM_INQ | vcc->channo, in fs_open()
1090 set_bit(ATM_VF_READY, &atm_vcc->flags); in fs_open()
1099 struct fs_dev *dev = FS_DEV (atm_vcc->dev); in fs_close()
1100 struct fs_vcc *vcc = FS_VCC (atm_vcc); in fs_close() local
1106 clear_bit(ATM_VF_READY, &atm_vcc->flags); in fs_close()
1108 fs_dprintk (FS_DEBUG_QSIZE, "--==**[%d]**==--", dev->ntxpckts); in fs_close()
1109 if (vcc->last_skb) { in fs_close()
1110 fs_dprintk (FS_DEBUG_QUEUE, "Waiting for skb %p to be sent.\n", in fs_close()
1111 vcc->last_skb); in fs_close()
1118 is taking too long. Maybe just use non-interruptible sleep on? -- REW */ in fs_close()
1119 wait_event_interruptible(vcc->close_wait, !vcc->last_skb); in fs_close()
1122 txtp = &atm_vcc->qos.txtp; in fs_close()
1123 rxtp = &atm_vcc->qos.rxtp; in fs_close()
1127 removal of the "CMD_IMM_INQ" part of the TX_PURGE_INH... -- REW */ in fs_close()
1130 submit_command (dev, &dev->hp_txq, in fs_close()
1131 QE_CMD_TX_PURGE_INH | /*QE_CMD_IMM_INQ|*/ vcc->channo, 0,0,0); in fs_close()
1132 clear_bit (vcc->channo, dev->tx_inuse); in fs_close()
1136 submit_command (dev, &dev->hp_txq, in fs_close()
1137 QE_CMD_RX_PURGE_INH | QE_CMD_IMM_INQ | vcc->channo, 0,0,0); in fs_close()
1138 dev->atm_vccs [vcc->channo] = NULL; in fs_close()
1143 channel? -- REW. Yes it is. -- Hang. Ok. I'll use -1 in fs_close()
1144 (0xfff...) -- REW */ in fs_close()
1145 submit_command (dev, &dev->hp_txq, in fs_close()
1147 0x80 + vcc->channo, -1, 0 ); in fs_close()
1151 fs_dprintk (FS_DEBUG_ALLOC, "Free vcc: %p\n", vcc); in fs_close()
1152 kfree (vcc); in fs_close()
1160 struct fs_dev *dev = FS_DEV (atm_vcc->dev); in fs_send()
1161 struct fs_vcc *vcc = FS_VCC (atm_vcc); in fs_send() local
1167 fs_dprintk (FS_DEBUG_SEND, "Send: atm_vcc %p skb %p vcc %p dev %p\n", in fs_send()
1168 atm_vcc, skb, vcc, dev); in fs_send()
1170 fs_dprintk (FS_DEBUG_ALLOC, "Alloc t-skb: %p (atm_send)\n", skb); in fs_send()
1172 ATM_SKB(skb)->vcc = atm_vcc; in fs_send()
1174 vcc->last_skb = skb; in fs_send()
1177 fs_dprintk (FS_DEBUG_ALLOC, "Alloc transd: %p(%zd)\n", td, sizeof (struct FS_BPENTRY)); in fs_send()
1180 return -ENOMEM; in fs_send()
1184 *(int *) skb->data); in fs_send()
1186 td->flags = TD_EPI | TD_DATA | skb->len; in fs_send()
1187 td->next = 0; in fs_send()
1188 td->bsa = virt_to_bus (skb->data); in fs_send()
1189 td->skb = skb; in fs_send()
1190 td->dev = dev; in fs_send()
1191 dev->ntxpckts++; in fs_send()
1195 dq[qd].flags = td->flags; in fs_send()
1196 dq[qd].next = td->next; in fs_send()
1197 dq[qd].bsa = td->bsa; in fs_send()
1198 dq[qd].skb = td->skb; in fs_send()
1199 dq[qd].dev = td->dev; in fs_send()
1204 submit_queue (dev, &dev->hp_txq, in fs_send()
1205 QE_TRANSMIT_DE | vcc->channo, in fs_send()
1210 read_fs (dev, Q_EA (dev->hp_txq.offset)) - in fs_send()
1211 read_fs (dev, Q_SA (dev->hp_txq.offset)), in fs_send()
1212 read_fs (dev, Q_EA (dev->tx_relq.offset)) - in fs_send()
1213 read_fs (dev, Q_SA (dev->tx_relq.offset))); in fs_send()
1227 return -ENOIOCTLCMD;
1231 static int fs_getsockopt(struct atm_vcc *vcc,int level,int optname,
1240 static int fs_setsockopt(struct atm_vcc *vcc,int level,int optname,
1265 static int fs_change_qos(struct atm_vcc *vcc,struct atm_qos *qos,int flags)
1315 submit_command (dev, &dev->hp_txq, QE_CMD_PRP_WR | QE_CMD_IMM_INQ, in write_phy()
1324 while (reginit->reg != PHY_EOF) { in init_phy()
1325 if (reginit->reg == PHY_CLEARALL) { in init_phy()
1327 for (i=0;i<reginit->val;i++) { in init_phy()
1331 write_phy (dev, reginit->reg, reginit->val); in init_phy()
1360 NOT documented that way in the Windows driver. -- REW */ in reset_chip()
1362 the init sequence. However, a small hardware-feature, will in reset_chip()
1365 number. -- REW */ in reset_chip()
1370 write_fs (dev, 0x200 + i * 4, -1); in reset_chip()
1381 if ((unsigned long)t & (alignment-1)) { in aligned_kmalloc()
1382 printk ("Kmalloc doesn't align things correctly! %p\n", t); in aligned_kmalloc()
1396 struct FS_QENTRY *p; in init_q() local
1403 p = aligned_kmalloc (sz, GFP_KERNEL, 0x10); in init_q()
1404 fs_dprintk (FS_DEBUG_ALLOC, "Alloc queue: %p(%d)\n", p, sz); in init_q()
1406 if (!p) return 0; in init_q()
1408 write_fs (dev, Q_SA(queue), virt_to_bus(p)); in init_q()
1409 write_fs (dev, Q_EA(queue), virt_to_bus(p+nentries-1)); in init_q()
1410 write_fs (dev, Q_WP(queue), virt_to_bus(p)); in init_q()
1411 write_fs (dev, Q_RP(queue), virt_to_bus(p)); in init_q()
1414 no pre-warning to empty queues: We do our best to keep the in init_q()
1419 txq->sa = p; in init_q()
1420 txq->ea = p; in init_q()
1421 txq->offset = queue; in init_q()
1441 fp->offset = queue; in init_fp()
1442 fp->bufsize = bufsize; in init_fp()
1443 fp->nr_buffers = nr_buffers; in init_fp()
1454 return read_fs (dev, FP_CNT (fp->offset)); in nr_buffers_in_freepool()
1456 return fp->n; in nr_buffers_in_freepool()
1461 /* Check if this gets going again if a pool ever runs out. -- Yes, it
1463 working again after that... -- REW */
1473 fs_dprintk (FS_DEBUG_QUEUE, "Topping off queue at %x (%d-%d/%d)\n", in top_off_fp()
1474 fp->offset, read_fs (dev, FP_CNT (fp->offset)), fp->n, in top_off_fp()
1475 fp->nr_buffers); in top_off_fp()
1476 while (nr_buffers_in_freepool(dev, fp) < fp->nr_buffers) { in top_off_fp()
1478 skb = alloc_skb (fp->bufsize, gfp_flags); in top_off_fp()
1479 fs_dprintk (FS_DEBUG_ALLOC, "Alloc rec-skb: %p(%d)\n", skb, fp->bufsize); in top_off_fp()
1482 fs_dprintk (FS_DEBUG_ALLOC, "Alloc rec-d: %p(%zd)\n", ne, sizeof (struct FS_BPENTRY)); in top_off_fp()
1484 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-skb: %p\n", skb); in top_off_fp()
1489 fs_dprintk (FS_DEBUG_QUEUE, "Adding skb %p desc %p -> %p(%p) ", in top_off_fp()
1490 skb, ne, skb->data, skb->head); in top_off_fp()
1492 ne->flags = FP_FLAGS_EPI | fp->bufsize; in top_off_fp()
1493 ne->next = virt_to_bus (NULL); in top_off_fp()
1494 ne->bsa = virt_to_bus (skb->data); in top_off_fp()
1495 ne->aal_bufsize = fp->bufsize; in top_off_fp()
1496 ne->skb = skb; in top_off_fp()
1497 ne->fp = fp; in top_off_fp()
1501 * machine pointers (could be 64-bit) into a in top_off_fp()
1502 * 32-bit register. in top_off_fp()
1505 qe_tmp = read_fs (dev, FP_EA(fp->offset)); in top_off_fp()
1509 qe->next = virt_to_bus(ne); in top_off_fp()
1510 qe->flags &= ~FP_FLAGS_EPI; in top_off_fp()
1512 write_fs (dev, FP_SA(fp->offset), virt_to_bus(ne)); in top_off_fp()
1514 write_fs (dev, FP_EA(fp->offset), virt_to_bus (ne)); in top_off_fp()
1515 fp->n++; /* XXX Atomic_inc? */ in top_off_fp()
1516 write_fs (dev, FP_CTU(fp->offset), 1); in top_off_fp()
1526 write_fs (dev, Q_SA(txq->offset), 0); in free_queue()
1527 write_fs (dev, Q_EA(txq->offset), 0); in free_queue()
1528 write_fs (dev, Q_RP(txq->offset), 0); in free_queue()
1529 write_fs (dev, Q_WP(txq->offset), 0); in free_queue()
1532 fs_dprintk (FS_DEBUG_ALLOC, "Free queue: %p\n", txq->sa); in free_queue()
1533 kfree (txq->sa); in free_queue()
1542 write_fs (dev, FP_CNF(fp->offset), 0); in free_freepool()
1543 write_fs (dev, FP_SA (fp->offset), 0); in free_freepool()
1544 write_fs (dev, FP_EA (fp->offset), 0); in free_freepool()
1545 write_fs (dev, FP_CNT(fp->offset), 0); in free_freepool()
1546 write_fs (dev, FP_CTU(fp->offset), 0); in free_freepool()
1566 /* Aaargh! I'm ashamed. This costs more lines-of-code than the actual in fs_irq()
1567 interrupt routine!. (Well, used to when I wrote that comment) -- REW */ in fs_irq()
1574 free_irq (dev->irq, dev_id); in fs_irq()
1576 dev->irq); in fs_irq()
1585 read_fs (dev, Q_EA (dev->hp_txq.offset)) - in fs_irq()
1586 read_fs (dev, Q_SA (dev->hp_txq.offset)), in fs_irq()
1587 read_fs (dev, Q_EA (dev->tx_relq.offset)) - in fs_irq()
1588 read_fs (dev, Q_SA (dev->tx_relq.offset))); in fs_irq()
1602 fs_dprintk (FS_DEBUG_IRQ, "Iiiin-coming (0)!!!!\n"); in fs_irq()
1603 process_incoming (dev, &dev->rx_rq[0]); in fs_irq()
1605 top_off_fp (dev, &dev->rx_fp[0], GFP_ATOMIC); in fs_irq()
1606 top_off_fp (dev, &dev->rx_fp[1], GFP_ATOMIC); in fs_irq()
1610 fs_dprintk (FS_DEBUG_IRQ, "Iiiin-coming (1)!!!!\n"); in fs_irq()
1611 process_incoming (dev, &dev->rx_rq[1]); in fs_irq()
1612 top_off_fp (dev, &dev->rx_fp[2], GFP_ATOMIC); in fs_irq()
1613 top_off_fp (dev, &dev->rx_fp[3], GFP_ATOMIC); in fs_irq()
1617 fs_dprintk (FS_DEBUG_IRQ, "Iiiin-coming (2)!!!!\n"); in fs_irq()
1618 process_incoming (dev, &dev->rx_rq[2]); in fs_irq()
1619 top_off_fp (dev, &dev->rx_fp[4], GFP_ATOMIC); in fs_irq()
1620 top_off_fp (dev, &dev->rx_fp[5], GFP_ATOMIC); in fs_irq()
1624 fs_dprintk (FS_DEBUG_IRQ, "Iiiin-coming (3)!!!!\n"); in fs_irq()
1625 process_incoming (dev, &dev->rx_rq[3]); in fs_irq()
1626 top_off_fp (dev, &dev->rx_fp[6], GFP_ATOMIC); in fs_irq()
1627 top_off_fp (dev, &dev->rx_fp[7], GFP_ATOMIC); in fs_irq()
1632 process_return_queue (dev, &dev->st_q); in fs_irq()
1637 process_txdone_queue (dev, &dev->tx_relq); in fs_irq()
1651 dev->timer.expires = jiffies + FS_POLL_FREQ; in fs_poll()
1652 add_timer (&dev->timer); in fs_poll()
1663 pci_dev = dev->pci_dev; in fs_init()
1668 dev->pci_dev->irq); in fs_init()
1675 dev->hw_base = pci_resource_start(pci_dev, 0); in fs_init()
1677 dev->base = ioremap(dev->hw_base, 0x1000); in fs_init()
1678 if (!dev->base) in fs_init()
1702 while (--to) { in fs_init()
1725 dev->channel_mask = 0x1f; in fs_init()
1726 dev->channo = 0; in fs_init()
1764 * performance jumped 50->70... */ in fs_init()
1771 dev->atm_dev->ci_range.vpi_bits = 12; in fs_init()
1772 dev->atm_dev->ci_range.vci_bits = 16; in fs_init()
1773 dev->nchannels = FS50_NR_CHANNELS; in fs_init()
1776 | (((1 << FS155_VPI_BITS) - 1) * RAS0_VPSEL) in fs_init()
1777 | (((1 << FS155_VCI_BITS) - 1) * RAS0_VCSEL)); in fs_init()
1780 dev->atm_dev->ci_range.vpi_bits = FS155_VPI_BITS; in fs_init()
1781 dev->atm_dev->ci_range.vci_bits = FS155_VCI_BITS; in fs_init()
1790 write_fs (dev, RAM, (1 << (28 - FS155_VPI_BITS - FS155_VCI_BITS)) - 1); in fs_init()
1791 dev->nchannels = FS155_NR_CHANNELS; in fs_init()
1793 dev->atm_vccs = kcalloc (dev->nchannels, sizeof (struct atm_vcc *), in fs_init()
1795 fs_dprintk (FS_DEBUG_ALLOC, "Alloc atmvccs: %p(%zd)\n", in fs_init()
1796 dev->atm_vccs, dev->nchannels * sizeof (struct atm_vcc *)); in fs_init()
1798 if (!dev->atm_vccs) { in fs_init()
1799 printk (KERN_WARNING "Couldn't allocate memory for VCC buffers. Woops!\n"); in fs_init()
1804 dev->tx_inuse = kzalloc (dev->nchannels / 8 /* bits/byte */ , GFP_KERNEL); in fs_init()
1805 fs_dprintk (FS_DEBUG_ALLOC, "Alloc tx_inuse: %p(%d)\n", in fs_init()
1806 dev->atm_vccs, dev->nchannels / 8); in fs_init()
1808 if (!dev->tx_inuse) { in fs_init()
1813 /* -- RAS1 : FS155 and 50 differ. Default (0) should be OK for both */ in fs_init()
1814 /* -- RAS2 : FS50 only: Default is OK. */ in fs_init()
1816 /* DMAMODE, default should be OK. -- REW */ in fs_init()
1819 init_q (dev, &dev->hp_txq, TX_PQ(TXQ_HP), TXQ_NENTRIES, 0); in fs_init()
1820 init_q (dev, &dev->lp_txq, TX_PQ(TXQ_LP), TXQ_NENTRIES, 0); in fs_init()
1821 init_q (dev, &dev->tx_relq, TXB_RQ, TXQ_NENTRIES, 1); in fs_init()
1822 init_q (dev, &dev->st_q, ST_Q, TXQ_NENTRIES, 1); in fs_init()
1825 init_fp (dev, &dev->rx_fp[i], RXB_FP(i), in fs_init()
1827 top_off_fp (dev, &dev->rx_fp[i], GFP_KERNEL); in fs_init()
1832 init_q (dev, &dev->rx_rq[i], RXB_RQ(i), RXRQ_NENTRIES, 1); in fs_init()
1834 dev->irq = pci_dev->irq; in fs_init()
1835 if (request_irq (dev->irq, fs_irq, IRQF_SHARED, "firestream", dev)) { in fs_init()
1836 printk (KERN_WARNING "couldn't get irq %d for firestream.\n", pci_dev->irq); in fs_init()
1840 fs_dprintk (FS_DEBUG_INIT, "Grabbed irq %d for dev at %p.\n", dev->irq, dev); in fs_init()
1877 timer_setup(&dev->timer, fs_poll, 0); in fs_init()
1878 dev->timer.expires = jiffies + FS_POLL_FREQ; in fs_init()
1879 add_timer (&dev->timer); in fs_init()
1882 dev->atm_dev->dev_data = dev; in fs_init()
1887 iounmap(dev->base); in fs_init()
1901 fs_dprintk (FS_DEBUG_ALLOC, "Alloc fs-dev: %p(%zd)\n", in firestream_init_one()
1905 atm_dev = atm_dev_register("fs", &pci_dev->dev, &ops, -1, NULL); in firestream_init_one()
1909 fs_dev->pci_dev = pci_dev; in firestream_init_one()
1910 fs_dev->atm_dev = atm_dev; in firestream_init_one()
1911 fs_dev->flags = ent->driver_data; in firestream_init_one()
1916 fs_dev->next = fs_boards; in firestream_init_one()
1925 return -ENODEV; in firestream_init_one()
1932 struct fs_vcc *vcc; in firestream_remove_one() local
1948 printk ("%d: %p: %08x %08x %p %p\n", in firestream_remove_one()
1956 fs_dprintk (FS_DEBUG_CLEANUP, "Releasing resources for dev at %p.\n", dev); in firestream_remove_one()
1960 for (i=0;i < dev->nchannels;i++) { in firestream_remove_one()
1961 if (dev->atm_vccs[i]) { in firestream_remove_one()
1962 vcc = FS_VCC (dev->atm_vccs[i]); in firestream_remove_one()
1963 submit_command (dev, &dev->hp_txq, in firestream_remove_one()
1964 QE_CMD_TX_PURGE_INH | QE_CMD_IMM_INQ | vcc->channo, 0,0,0); in firestream_remove_one()
1965 submit_command (dev, &dev->hp_txq, in firestream_remove_one()
1966 QE_CMD_RX_PURGE_INH | QE_CMD_IMM_INQ | vcc->channo, 0,0,0); in firestream_remove_one()
1974 for (fp=bus_to_virt (read_fs (dev, FP_SA(dev->rx_fp[i].offset))); in firestream_remove_one()
1975 !(fp->flags & FP_FLAGS_EPI);fp = nxt) { in firestream_remove_one()
1976 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-skb: %p\n", fp->skb); in firestream_remove_one()
1977 dev_kfree_skb_any (fp->skb); in firestream_remove_one()
1978 nxt = bus_to_virt (fp->next); in firestream_remove_one()
1979 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-d: %p\n", fp); in firestream_remove_one()
1982 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-skb: %p\n", fp->skb); in firestream_remove_one()
1983 dev_kfree_skb_any (fp->skb); in firestream_remove_one()
1984 fs_dprintk (FS_DEBUG_ALLOC, "Free rec-d: %p\n", fp); in firestream_remove_one()
1992 fs_dprintk (FS_DEBUG_CLEANUP, "Freeing irq%d.\n", dev->irq); in firestream_remove_one()
1993 free_irq (dev->irq, dev); in firestream_remove_one()
1994 del_timer_sync (&dev->timer); in firestream_remove_one()
1996 atm_dev_deregister(dev->atm_dev); in firestream_remove_one()
1997 free_queue (dev, &dev->hp_txq); in firestream_remove_one()
1998 free_queue (dev, &dev->lp_txq); in firestream_remove_one()
1999 free_queue (dev, &dev->tx_relq); in firestream_remove_one()
2000 free_queue (dev, &dev->st_q); in firestream_remove_one()
2002 fs_dprintk (FS_DEBUG_ALLOC, "Free atmvccs: %p\n", dev->atm_vccs); in firestream_remove_one()
2003 kfree (dev->atm_vccs); in firestream_remove_one()
2006 free_freepool (dev, &dev->rx_fp[i]); in firestream_remove_one()
2009 free_queue (dev, &dev->rx_rq[i]); in firestream_remove_one()
2011 iounmap(dev->base); in firestream_remove_one()
2012 fs_dprintk (FS_DEBUG_ALLOC, "Free fs-dev: %p\n", dev); in firestream_remove_one()
2013 nxtdev = dev->next; in firestream_remove_one()