Lines Matching +full:dont +full:- +full:validate
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* lanai.c -- Copyright 1999-2003 by Mitchell Blank Jr <mitch@sfgoth.com>
5 * chipset such as the Speedstream 3010 and the ENI-25p. The
7 * have the code to drive the on-board Alcatel DSL chipset (yet).
14 * o We don't support the Speedstream 3060 yet - this card has
15 * an on-board DSL modem chip by Alcatel and the driver will
24 * enable it yet - bugs in that code may actually damage your
32 * This isn't too much work - I just wanted to get other things
37 * o There aren't any ioctl's yet -- I'd like to eventually support
48 * v.1.00 -- 26-JUL-2003 -- PCI/DMA updates
49 * v.0.02 -- 11-JAN-2000 -- Endian fixes
50 * v.0.01 -- 30-NOV-1999 -- Initial release
61 #include <linux/dma-mapping.h>
66 /* -------------------- TUNABLE PARAMATERS: */
87 * The programming guide specifies a full test of the on-board SRAM
98 /* TODO: make above a module load-time option */
104 /* #define READ_EEPROM */ /* ***DONT ENABLE YET*** */
105 /* TODO: make above a module load-time option (also) */
108 * Depth of TX fifo (in 128 byte units; range 2-31)
115 /* TODO: make above a module load-time option */
118 * How often (in jiffies) we will try to unstick stuck connections -
122 /* TODO: make above a module load-time option */
129 /* TODO: make above a module load-time option */
135 /* TODO: make above a module load-time option */
143 /* TODO: make above a module load-time option */
150 /* TODO: make above a module load-time option */
156 /* TODO: make above a module load-time option (also) */
158 /* -------------------- DEBUGGING AIDS: */
186 /* -------------------- DATA DEFINITIONS: */
219 * This is the card-specific per-vcc data. Note that unlike some other
220 * drivers there is NOT a 1-to-1 correspondance between these and
221 * atm_vcc's - each one of these represents an actual 2-way vcc, but
222 * an atm_vcc can be 1-way and share with a 1-way vcc in the other
223 * direction. To make it weirder, there can even be 0-way vccs
250 unsigned ovfl_trash; /* # of cells dropped - buffer overflow */
251 unsigned vci_trash; /* # of cells dropped - closed vci */
252 unsigned hec_err; /* # of cells dropped - bad HEC */
253 unsigned atm_ovfl; /* # of cells dropped - rx fifo overflow */
292 /* TODO - look at race conditions with maintence of conf1/conf2 */
293 /* TODO - transmit locking: should we use _irq not _irqsave? */
294 /* TODO - organize above in some rational fashion (see <asm/cache.h>) */
312 /* -------------------- BUFFER UTILITIES: */
315 * Lanai needs DMA buffers aligned to 256 bytes of at least 1024 bytes -
323 * Returns buf->start==NULL if no memory
341 * Technically we could use non-consistent mappings for in lanai_buf_allocate()
345 buf->start = dma_alloc_coherent(&pci->dev, in lanai_buf_allocate()
346 size, &buf->dmaaddr, GFP_KERNEL); in lanai_buf_allocate()
347 if (buf->start != NULL) { /* Success */ in lanai_buf_allocate()
348 /* Lanai requires 256-byte alignment of DMA bufs */ in lanai_buf_allocate()
349 APRINTK((buf->dmaaddr & ~0xFFFFFF00) == 0, in lanai_buf_allocate()
351 (unsigned long) buf->dmaaddr); in lanai_buf_allocate()
352 buf->ptr = buf->start; in lanai_buf_allocate()
353 buf->end = (u32 *) in lanai_buf_allocate()
354 (&((unsigned char *) buf->start)[size]); in lanai_buf_allocate()
355 memset(buf->start, 0, size); in lanai_buf_allocate()
365 return ((unsigned long) buf->end) - ((unsigned long) buf->start); in lanai_buf_size()
371 if (buf->start != NULL) { in lanai_buf_deallocate()
372 dma_free_coherent(&pci->dev, lanai_buf_size(buf), in lanai_buf_deallocate()
373 buf->start, buf->dmaaddr); in lanai_buf_deallocate()
374 buf->start = buf->end = buf->ptr = NULL; in lanai_buf_deallocate()
381 int order = get_order(lanai_buf_size(buf)) + (PAGE_SHIFT - 10); in lanai_buf_size_cardorder()
389 /* -------------------- PORT I/O UTILITIES: */
391 /* Registers (and their bit-fields) */
424 #define LOOPMODE_NORMAL (0) /* Normal - no loop */
471 return lanai->base + reg; in reg_addr()
479 RWDEBUG("R [0x%08X] 0x%02X = 0x%08X\n", (unsigned int) lanai->base, in reg_read()
487 RWDEBUG("W [0x%08X] 0x%02X < 0x%08X\n", (unsigned int) lanai->base, in reg_write()
494 reg_write(lanai, lanai->conf1, Config1_Reg); in conf1_write()
499 reg_write(lanai, lanai->conf2, Config2_Reg); in conf2_write()
506 if (unlikely((lanai->conf1 & CONFIG1_POWERDOWN) != 0)) in conf2_write_if_powerup()
525 /* -------------------- CARD SRAM UTILITIES: */
527 /* The SRAM is mapped into normal PCI memory space - the only catch is
528 * that it is only 16-bits wide but must be accessed as 32-bit. The
537 return lanai->base + SRAM_START + offset; in sram_addr()
561 lanai->number, offset, in sram_test_word()
563 return -EIO; in sram_test_word()
588 /* -------------------- CARD-BASED VCC TABLE UTILITIES: */
598 #define RMMODE_PIPEALL (3) /* pipe non-RM too */
602 #define RXMODE_AAL0 (1) /* non-AAL5 mode */
604 #define RXMODE_AAL5_STREAM (3) /* AAL5 w/o per-PDU intr */
650 APRINTK(lvcc->vbase != NULL, "cardvcc_read: unbound vcc!\n"); in cardvcc_read()
651 val= readl(lvcc->vbase + offset); in cardvcc_read()
653 lvcc->vci, (int) offset, val); in cardvcc_read()
660 APRINTK(lvcc->vbase != NULL, "cardvcc_write: unbound vcc!\n"); in cardvcc_write()
663 (unsigned int) val, lvcc->vci, (unsigned int) offset); in cardvcc_write()
665 lvcc->vci, (unsigned int) offset, (unsigned int) val); in cardvcc_write()
666 writel(val, lvcc->vbase + offset); in cardvcc_write()
669 /* -------------------- COMPUTE SIZE OF AN AAL5 PDU: */
671 /* How many bytes will an AAL5 PDU take to transmit - remember that:
681 /* -------------------- FREE AN ATM SKB: */
685 if (atmvcc->pop != NULL) in lanai_free_skb()
686 atmvcc->pop(atmvcc, skb); in lanai_free_skb()
691 /* -------------------- TURN VCCS ON AND OFF: */
696 if (lvcc->rx.atmvcc->qos.aal == ATM_AAL5) { in host_vcc_start_rx()
697 dma_addr_t dmaaddr = lvcc->rx.buf.dmaaddr; in host_vcc_start_rx()
705 RXADDR1_SET_SIZE(lanai_buf_size_cardorder(&lvcc->rx.buf))| in host_vcc_start_rx()
707 /* RXADDR1_OAM_PRESERVE | --- no OAM support yet */ in host_vcc_start_rx()
719 dma_addr_t dmaaddr = lvcc->tx.buf.dmaaddr; in host_vcc_start_tx()
727 (lvcc->tx.atmvcc->qos.txtp.traffic_class == ATM_CBR) ? in host_vcc_start_tx()
728 TXCBR_NEXT_BOZO | lvcc->vci : 0, vcc_txcbr_next); in host_vcc_start_tx()
732 TXADDR1_SET_SIZE(lanai_buf_size_cardorder(&lvcc->tx.buf)), in host_vcc_start_tx()
739 if (lvcc->vbase == NULL) /* We were never bound to a VCI */ in lanai_shutdown_rx_vci()
741 /* 15.1.1 - set to trashing, wait one cell time (15us) */ in lanai_shutdown_rx_vci()
746 /* 15.1.2 - clear rest of entries */ in lanai_shutdown_rx_vci()
758 * can take awhile -- up to 370ms for a full 128KB buffer
767 int read, write, lastread = -1; in lanai_shutdown_tx_vci()
769 if (lvcc->vbase == NULL) /* We were never bound to a VCI */ in lanai_shutdown_tx_vci()
771 /* 15.2.1 - wait for queue to drain */ in lanai_shutdown_tx_vci()
772 while ((skb = skb_dequeue(&lvcc->tx.backlog)) != NULL) in lanai_shutdown_tx_vci()
773 lanai_free_skb(lvcc->tx.atmvcc, skb); in lanai_shutdown_tx_vci()
775 __clear_bit(lvcc->vci, lanai->backlog_vccs); in lanai_shutdown_tx_vci()
783 (((lanai_buf_size(&lvcc->tx.buf) / 1024) * HZ) >> 7); in lanai_shutdown_tx_vci()
788 (lvcc->tx.atmvcc->qos.txtp.traffic_class != ATM_CBR || in lanai_shutdown_tx_vci()
799 lvcc->tx.atmvcc->dev->number, lvcc->vci); in lanai_shutdown_tx_vci()
805 /* 15.2.2 - clear out all tx registers */ in lanai_shutdown_tx_vci()
815 /* -------------------- MANAGING AAL0 RX BUFFER: */
820 lanai_buf_allocate(&lanai->aal0buf, AAL0_RX_BUFFER_SIZE, 80, in aal0_buffer_allocate()
821 lanai->pci); in aal0_buffer_allocate()
822 return (lanai->aal0buf.start == NULL) ? -ENOMEM : 0; in aal0_buffer_allocate()
828 lanai_buf_deallocate(&lanai->aal0buf, lanai->pci); in aal0_buffer_free()
831 /* -------------------- EEPROM UTILITIES: */
853 lanai->number); in eeprom_read()
854 memset(&lanai->eeprom[EEPROM_MAC], 0, 6); in eeprom_read()
860 lanai->serialno = 0; in eeprom_validate()
861 lanai->magicno = EEPROM_MAGIC_VALUE; in eeprom_validate()
872 #define set_config1(x) do { lanai->conf1 = x; conf1_write(lanai); \ in eeprom_read()
874 #define clock_h() set_config1(lanai->conf1 | CONFIG1_PROMCLK) in eeprom_read()
875 #define clock_l() set_config1(lanai->conf1 &~ CONFIG1_PROMCLK) in eeprom_read()
876 #define data_h() set_config1(lanai->conf1 | CONFIG1_PROMDATA) in eeprom_read()
877 #define data_l() set_config1(lanai->conf1 &~ CONFIG1_PROMDATA) in eeprom_read()
890 tmp = (lanai->conf1 & ~CONFIG1_PROMDATA) | in eeprom_read()
892 if (lanai->conf1 != tmp) { in eeprom_read()
904 for (data = 0, i = 7; i >= 0; i--) { in eeprom_read()
915 lanai->eeprom[address] = data; in eeprom_read()
924 lanai->number, address); in eeprom_read()
925 return -EIO; in eeprom_read()
936 /* read a big-endian 4-byte value out of eeprom */
939 return be32_to_cpup((const u32 *) &lanai->eeprom[address]); in eeprom_be4()
942 /* Checksum/validate EEPROM contents */
947 const u8 *e = lanai->eeprom; in eeprom_validate()
961 /* Validate checksum */ in eeprom_validate()
967 "(wanted 0x%02X, got 0x%02X)\n", lanai->number, in eeprom_validate()
969 return -EIO; in eeprom_validate()
974 "bad (wanted 0x%02X, got 0x%02X)\n", lanai->number, in eeprom_validate()
976 return -EIO; in eeprom_validate()
983 "(0x%02X, inverse 0x%02X)\n", lanai->number, in eeprom_validate()
986 return -EIO; in eeprom_validate()
990 lanai->serialno = eeprom_be4(lanai, EEPROM_SERIAL); in eeprom_validate()
992 if ((lanai->serialno ^ v) != 0xFFFFFFFF) { in eeprom_validate()
994 "don't match (0x%08X, inverse 0x%08X)\n", lanai->number, in eeprom_validate()
995 (unsigned int) lanai->serialno, (unsigned int) v); in eeprom_validate()
996 return -EIO; in eeprom_validate()
998 DPRINTK("eeprom: Serial number = %d\n", (unsigned int) lanai->serialno); in eeprom_validate()
1000 lanai->magicno = eeprom_be4(lanai, EEPROM_MAGIC); in eeprom_validate()
1002 if ((lanai->magicno ^ v) != 0xFFFFFFFF) { in eeprom_validate()
1004 "don't match (0x%08X, inverse 0x%08X)\n", lanai->number, in eeprom_validate()
1005 lanai->magicno, v); in eeprom_validate()
1006 return -EIO; in eeprom_validate()
1008 DPRINTK("eeprom: Magic number = 0x%08X\n", lanai->magicno); in eeprom_validate()
1009 if (lanai->magicno != EEPROM_MAGIC_VALUE) in eeprom_validate()
1010 printk(KERN_WARNING DEV_LABEL "(itf %d): warning - EEPROM " in eeprom_validate()
1012 lanai->number, (unsigned int) lanai->magicno, in eeprom_validate()
1021 return &lanai->eeprom[EEPROM_MAC]; in eeprom_mac()
1024 /* -------------------- INTERRUPT HANDLING UTILITIES: */
1037 #define INT_AAL0_STR (0x00000800) /* Non-AAL5 buffer half filled */
1038 #define INT_AAL0 (0x00001000) /* Non-AAL5 data available */
1066 /* -------------------- CARD/PCI STATUS: */
1078 u32 changes = new ^ lanai->status; in lanai_check_status()
1079 lanai->status = new; in lanai_check_status()
1082 status_message(lanai->number, name, new & flag) in lanai_check_status()
1099 result = pci_read_config_word(lanai->pci, PCI_STATUS, &s); in pcistatus_check()
1102 "%d\n", lanai->number, result); in pcistatus_check()
1110 result = pci_write_config_word(lanai->pci, PCI_STATUS, s); in pcistatus_check()
1113 "%d\n", lanai->number, result); in pcistatus_check()
1118 pcistatus_got(lanai->number, name); \ in pcistatus_check()
1119 ++lanai->stats.pcierr_##stat; \ in pcistatus_check()
1130 /* -------------------- VCC TX BUFFER UTILITIES: */
1137 r -= ((unsigned long) lvcc->tx.buf.ptr) - in vcc_tx_space()
1138 ((unsigned long) lvcc->tx.buf.start); in vcc_tx_space()
1139 r -= 16; /* Leave "bubble" - if start==end it looks empty */ in vcc_tx_space()
1141 r += lanai_buf_size(&lvcc->tx.buf); in vcc_tx_space()
1148 return !skb_queue_empty(&lvcc->tx.backlog); in vcc_is_backlogged()
1157 /* Add 32-bit descriptor with its padding */
1162 APRINTK((((unsigned long) lvcc->tx.buf.ptr) & 15) == 0, in vcc_tx_add_aal5_descriptor()
1163 "vcc_tx_add_aal5_descriptor: bad ptr=%p\n", lvcc->tx.buf.ptr); in vcc_tx_add_aal5_descriptor()
1164 lvcc->tx.buf.ptr += 4; /* Hope the values REALLY don't matter */ in vcc_tx_add_aal5_descriptor()
1165 pos = ((unsigned char *) lvcc->tx.buf.ptr) - in vcc_tx_add_aal5_descriptor()
1166 (unsigned char *) lvcc->tx.buf.start; in vcc_tx_add_aal5_descriptor()
1169 "start,ptr,end=%p,%p,%p\n", pos, lvcc->vci, in vcc_tx_add_aal5_descriptor()
1170 lvcc->tx.buf.start, lvcc->tx.buf.ptr, lvcc->tx.buf.end); in vcc_tx_add_aal5_descriptor()
1171 pos = (pos + len) & (lanai_buf_size(&lvcc->tx.buf) - 1); in vcc_tx_add_aal5_descriptor()
1174 "start,ptr,end=%p,%p,%p\n", pos, lvcc->vci, in vcc_tx_add_aal5_descriptor()
1175 lvcc->tx.buf.start, lvcc->tx.buf.ptr, lvcc->tx.buf.end); in vcc_tx_add_aal5_descriptor()
1176 lvcc->tx.buf.ptr[-1] = in vcc_tx_add_aal5_descriptor()
1178 ((lvcc->tx.atmvcc->atm_options & ATM_ATMOPT_CLP) ? in vcc_tx_add_aal5_descriptor()
1180 if (lvcc->tx.buf.ptr >= lvcc->tx.buf.end) in vcc_tx_add_aal5_descriptor()
1181 lvcc->tx.buf.ptr = lvcc->tx.buf.start; in vcc_tx_add_aal5_descriptor()
1184 /* Add 32-bit AAL5 trailer and leave room for its CRC */
1188 APRINTK((((unsigned long) lvcc->tx.buf.ptr) & 15) == 8, in vcc_tx_add_aal5_trailer()
1189 "vcc_tx_add_aal5_trailer: bad ptr=%p\n", lvcc->tx.buf.ptr); in vcc_tx_add_aal5_trailer()
1190 lvcc->tx.buf.ptr += 2; in vcc_tx_add_aal5_trailer()
1191 lvcc->tx.buf.ptr[-2] = cpu_to_be32((uu << 24) | (cpi << 16) | len); in vcc_tx_add_aal5_trailer()
1192 if (lvcc->tx.buf.ptr >= lvcc->tx.buf.end) in vcc_tx_add_aal5_trailer()
1193 lvcc->tx.buf.ptr = lvcc->tx.buf.start; in vcc_tx_add_aal5_trailer()
1201 e = ((unsigned char *) lvcc->tx.buf.ptr) + n; in vcc_tx_memcpy()
1202 m = e - (unsigned char *) lvcc->tx.buf.end; in vcc_tx_memcpy()
1205 memcpy(lvcc->tx.buf.ptr, src, n - m); in vcc_tx_memcpy()
1207 memcpy(lvcc->tx.buf.start, src + n - m, m); in vcc_tx_memcpy()
1208 e = ((unsigned char *) lvcc->tx.buf.start) + m; in vcc_tx_memcpy()
1210 lvcc->tx.buf.ptr = (u32 *) e; in vcc_tx_memcpy()
1219 e = ((unsigned char *) lvcc->tx.buf.ptr) + n; in vcc_tx_memzero()
1220 m = e - (unsigned char *) lvcc->tx.buf.end; in vcc_tx_memzero()
1223 memset(lvcc->tx.buf.ptr, 0, n - m); in vcc_tx_memzero()
1225 memset(lvcc->tx.buf.start, 0, m); in vcc_tx_memzero()
1226 e = ((unsigned char *) lvcc->tx.buf.start) + m; in vcc_tx_memzero()
1228 lvcc->tx.buf.ptr = (u32 *) e; in vcc_tx_memzero()
1235 int i, ptr = ((unsigned char *) lvcc->tx.buf.ptr) - in lanai_endtx()
1236 (unsigned char *) lvcc->tx.buf.start; in lanai_endtx()
1239 ptr, lvcc->vci, lvcc->tx.buf.start, lvcc->tx.buf.ptr, in lanai_endtx()
1240 lvcc->tx.buf.end); in lanai_endtx()
1248 spin_lock(&lanai->endtxlock); in lanai_endtx()
1258 "always busy!\n", lanai->number); in lanai_endtx()
1269 reg_write(lanai, (ptr << 12) | lvcc->vci, Butt_Reg); in lanai_endtx()
1270 spin_unlock(&lanai->endtxlock); in lanai_endtx()
1281 APRINTK(pdusize == aal5_size(skb->len), in lanai_send_one_aal5()
1283 pdusize, aal5_size(skb->len)); in lanai_send_one_aal5()
1285 pad = pdusize - skb->len - 8; in lanai_send_one_aal5()
1288 vcc_tx_memcpy(lvcc, skb->data, skb->len); in lanai_send_one_aal5()
1290 vcc_tx_add_aal5_trailer(lvcc, skb->len, 0, 0); in lanai_send_one_aal5()
1292 lanai_free_skb(lvcc->tx.atmvcc, skb); in lanai_send_one_aal5()
1293 atomic_inc(&lvcc->tx.atmvcc->stats->tx); in lanai_send_one_aal5()
1296 /* Try to fill the buffer - don't call unless there is backlog */
1305 lvcc->vci); in vcc_tx_unqueue_aal5()
1307 skb = skb_dequeue(&lvcc->tx.backlog); in vcc_tx_unqueue_aal5()
1310 n = aal5_size(skb->len); in vcc_tx_unqueue_aal5()
1312 /* No room for this packet - put it back on queue */ in vcc_tx_unqueue_aal5()
1313 skb_queue_head(&lvcc->tx.backlog, skb); in vcc_tx_unqueue_aal5()
1317 space -= n + 16; in vcc_tx_unqueue_aal5()
1321 __clear_bit(lvcc->vci, lanai->backlog_vccs); in vcc_tx_unqueue_aal5()
1334 n = aal5_size(skb->len); in vcc_tx_aal5()
1337 __set_bit(lvcc->vci, lanai->backlog_vccs); in vcc_tx_aal5()
1339 skb_queue_tail(&lvcc->tx.backlog, skb); in vcc_tx_aal5()
1356 /* Remember to increment lvcc->tx.atmvcc->stats->tx */ in vcc_tx_aal0()
1357 lanai_free_skb(lvcc->tx.atmvcc, skb); in vcc_tx_aal0()
1360 /* -------------------- VCC RX BUFFER UTILITIES: */
1366 int m = ((const unsigned char *) lvcc->rx.buf.ptr) + n - in vcc_rx_memcpy()
1367 ((const unsigned char *) (lvcc->rx.buf.end)); in vcc_rx_memcpy()
1370 memcpy(dest, lvcc->rx.buf.ptr, n - m); in vcc_rx_memcpy()
1371 memcpy(dest + n - m, lvcc->rx.buf.start, m); in vcc_rx_memcpy()
1382 u32 *end = &lvcc->rx.buf.start[endptr * 4]; in vcc_rx_aal5()
1383 int n = ((unsigned long) end) - ((unsigned long) lvcc->rx.buf.ptr); in vcc_rx_aal5()
1385 n += lanai_buf_size(&lvcc->rx.buf); in vcc_rx_aal5()
1386 APRINTK(n >= 0 && n < lanai_buf_size(&lvcc->rx.buf) && !(n & 15), in vcc_rx_aal5()
1388 n, lanai_buf_size(&lvcc->rx.buf)); in vcc_rx_aal5()
1389 /* Recover the second-to-last word to get true pdu length */ in vcc_rx_aal5()
1390 if ((x = &end[-2]) < lvcc->rx.buf.start) in vcc_rx_aal5()
1391 x = &lvcc->rx.buf.end[-2]; in vcc_rx_aal5()
1401 "on vci=%d - size=%d n=%d\n", in vcc_rx_aal5()
1402 lvcc->rx.atmvcc->dev->number, lvcc->vci, size, n); in vcc_rx_aal5()
1403 lvcc->stats.x.aal5.rx_badlen++; in vcc_rx_aal5()
1406 skb = atm_alloc_charge(lvcc->rx.atmvcc, size, GFP_ATOMIC); in vcc_rx_aal5()
1408 lvcc->stats.rx_nomem++; in vcc_rx_aal5()
1412 vcc_rx_memcpy(skb->data, lvcc, size); in vcc_rx_aal5()
1413 ATM_SKB(skb)->vcc = lvcc->rx.atmvcc; in vcc_rx_aal5()
1415 lvcc->rx.atmvcc->push(lvcc->rx.atmvcc, skb); in vcc_rx_aal5()
1416 atomic_inc(&lvcc->rx.atmvcc->stats->rx); in vcc_rx_aal5()
1418 lvcc->rx.buf.ptr = end; in vcc_rx_aal5()
1426 /* Remember to increment lvcc->rx.atmvcc->stats->rx */ in vcc_rx_aal0()
1429 /* -------------------- MANAGING HOST-BASED VCC TABLE: */
1441 APRINTK((lanai->num_vci) * sizeof(struct lanai_vcc *) <= PAGE_SIZE, in vcc_table_allocate()
1443 lanai->vccs = (struct lanai_vcc **) get_zeroed_page(GFP_KERNEL); in vcc_table_allocate()
1444 return (lanai->vccs == NULL) ? -ENOMEM : 0; in vcc_table_allocate()
1446 int bytes = (lanai->num_vci) * sizeof(struct lanai_vcc *); in vcc_table_allocate()
1447 lanai->vccs = vzalloc(bytes); in vcc_table_allocate()
1448 if (unlikely(lanai->vccs == NULL)) in vcc_table_allocate()
1449 return -ENOMEM; in vcc_table_allocate()
1457 free_page((unsigned long) lanai->vccs); in vcc_table_deallocate()
1459 vfree(lanai->vccs); in vcc_table_deallocate()
1469 skb_queue_head_init(&lvcc->tx.backlog); in new_lanai_vcc()
1471 lvcc->vci = -1; in new_lanai_vcc()
1486 lanai_buf_allocate(buf, size, max_sdu + 32, lanai->pci); in lanai_get_sized_buffer()
1487 if (unlikely(buf->start == NULL)) in lanai_get_sized_buffer()
1488 return -ENOMEM; in lanai_get_sized_buffer()
1491 "for %s buffer, got only %zu\n", lanai->number, size, in lanai_get_sized_buffer()
1501 return lanai_get_sized_buffer(lanai, &lvcc->rx.buf, in lanai_setup_rx_vci_aal5()
1502 qos->rxtp.max_sdu, AAL5_RX_MULTIPLIER, "RX"); in lanai_setup_rx_vci_aal5()
1510 if (qos->aal == ATM_AAL0) { in lanai_setup_tx_vci()
1511 lvcc->tx.unqueue = vcc_tx_unqueue_aal0; in lanai_setup_tx_vci()
1512 max_sdu = ATM_CELL_SIZE - 1; in lanai_setup_tx_vci()
1515 lvcc->tx.unqueue = vcc_tx_unqueue_aal5; in lanai_setup_tx_vci()
1516 max_sdu = qos->txtp.max_sdu; in lanai_setup_tx_vci()
1519 return lanai_get_sized_buffer(lanai, &lvcc->tx.buf, max_sdu, in lanai_setup_tx_vci()
1526 if (lvcc->vbase != NULL) in host_vcc_bind()
1530 if (lanai->nbound++ == 0) { in host_vcc_bind()
1532 lanai->conf1 &= ~CONFIG1_POWERDOWN; in host_vcc_bind()
1537 lvcc->vbase = cardvcc_addr(lanai, vci); in host_vcc_bind()
1538 lanai->vccs[lvcc->vci = vci] = lvcc; in host_vcc_bind()
1544 if (lvcc->vbase == NULL) in host_vcc_unbind()
1546 DPRINTK("Unbinding vci %d\n", lvcc->vci); in host_vcc_unbind()
1547 lvcc->vbase = NULL; in host_vcc_unbind()
1548 lanai->vccs[lvcc->vci] = NULL; in host_vcc_unbind()
1550 if (--lanai->nbound == 0) { in host_vcc_unbind()
1552 lanai->conf1 |= CONFIG1_POWERDOWN; in host_vcc_unbind()
1558 /* -------------------- RESET CARD: */
1562 printk(KERN_CRIT DEV_LABEL "(itf %d): *NOT* resetting - not " in lanai_reset()
1563 "implemented\n", lanai->number); in lanai_reset()
1566 * resetter - at least ack whatever interrupt sent us in lanai_reset()
1570 lanai->stats.card_reset++; in lanai_reset()
1573 /* -------------------- SERVICE LIST UTILITIES: */
1580 lanai_buf_allocate(&lanai->service, SERVICE_ENTRIES * 4, 8, in service_buffer_allocate()
1581 lanai->pci); in service_buffer_allocate()
1582 if (unlikely(lanai->service.start == NULL)) in service_buffer_allocate()
1583 return -ENOMEM; in service_buffer_allocate()
1585 lanai->service.start, in service_buffer_allocate()
1586 lanai_buf_size(&lanai->service), in service_buffer_allocate()
1587 lanai_buf_size_cardorder(&lanai->service)); in service_buffer_allocate()
1592 SSTUFF_SET_SIZE(lanai_buf_size_cardorder(&lanai->service)) | in service_buffer_allocate()
1593 SSTUFF_SET_ADDR(lanai->service.dmaaddr), in service_buffer_allocate()
1600 lanai_buf_deallocate(&lanai->service, lanai->pci); in service_buffer_deallocate()
1613 /* Handle one thing from the service list - returns true if it marked a
1621 lvcc = lanai->vccs[vci]; in handle_service()
1625 "vcc %d\n", lanai->number, (unsigned int) s, vci); in handle_service()
1627 lanai->stats.service_notx++; in handle_service()
1629 lanai->stats.service_norx++; in handle_service()
1633 if (unlikely(lvcc->tx.atmvcc == NULL)) { in handle_service()
1635 DPRINTK("(itf %d) got service entry 0x%X for non-TX " in handle_service()
1636 "vcc %d\n", lanai->number, (unsigned int) s, vci); in handle_service()
1637 lanai->stats.service_notx++; in handle_service()
1640 __set_bit(vci, lanai->transmit_ready); in handle_service()
1641 lvcc->tx.endptr = SERVICE_GET_END(s); in handle_service()
1645 if (unlikely(lvcc->rx.atmvcc == NULL)) { in handle_service()
1647 DPRINTK("(itf %d) got service entry 0x%X for non-RX " in handle_service()
1648 "vcc %d\n", lanai->number, (unsigned int) s, vci); in handle_service()
1649 lanai->stats.service_norx++; in handle_service()
1652 if (unlikely(lvcc->rx.atmvcc->qos.aal != ATM_AAL5)) { in handle_service()
1654 DPRINTK("(itf %d) got RX service entry 0x%X for non-AAL5 " in handle_service()
1655 "vcc %d\n", lanai->number, (unsigned int) s, vci); in handle_service()
1656 lanai->stats.service_rxnotaal5++; in handle_service()
1657 atomic_inc(&lvcc->rx.atmvcc->stats->rx_err); in handle_service()
1669 atomic_inc(&lvcc->rx.atmvcc->stats->rx_err); in handle_service()
1670 lvcc->stats.x.aal5.service_trash++; in handle_service()
1671 bytes = (SERVICE_GET_END(s) * 16) - in handle_service()
1672 (((unsigned long) lvcc->rx.buf.ptr) - in handle_service()
1673 ((unsigned long) lvcc->rx.buf.start)) + 47; in handle_service()
1675 bytes += lanai_buf_size(&lvcc->rx.buf); in handle_service()
1676 lanai->stats.ovfl_trash += (bytes / 48); in handle_service()
1681 atomic_inc(&lvcc->rx.atmvcc->stats->rx_err); in handle_service()
1682 lvcc->stats.x.aal5.service_stream++; in handle_service()
1684 "PDU on VCI %d!\n", lanai->number, vci); in handle_service()
1689 atomic_inc(&lvcc->rx.atmvcc->stats->rx_err); in handle_service()
1690 lvcc->stats.x.aal5.service_rxcrc++; in handle_service()
1691 lvcc->rx.buf.ptr = &lvcc->rx.buf.start[SERVICE_GET_END(s) * 4]; in handle_service()
1700 struct lanai_vcc *lvcc = lanai->vccs[vci]; in iter_transmit()
1702 lvcc->tx.unqueue(lanai, lvcc, lvcc->tx.endptr); in iter_transmit()
1705 /* Run service queue -- called from interrupt context or with
1706 * interrupts otherwise disabled and with the lanai->servicelock
1713 const u32 *end = lanai->service.start + wreg; in run_service()
1714 while (lanai->service.ptr != end) { in run_service()
1716 le32_to_cpup(lanai->service.ptr++)); in run_service()
1717 if (lanai->service.ptr >= lanai->service.end) in run_service()
1718 lanai->service.ptr = lanai->service.start; in run_service()
1723 vci_bitfield_iterate(lanai, lanai->transmit_ready, in run_service()
1725 bitmap_zero(lanai->transmit_ready, NUM_VCI); in run_service()
1730 /* -------------------- GATHER STATISTICS: */
1735 lanai->stats.atm_ovfl += STATS_GET_FIFO_OVFL(statreg); in get_statistics()
1736 lanai->stats.hec_err += STATS_GET_HEC_ERR(statreg); in get_statistics()
1737 lanai->stats.vci_trash += STATS_GET_BAD_VCI(statreg); in get_statistics()
1738 lanai->stats.ovfl_trash += STATS_GET_BUF_OVFL(statreg); in get_statistics()
1741 /* -------------------- POLLING TIMER: */
1747 struct lanai_vcc *lvcc = lanai->vccs[vci]; in iter_dequeue()
1749 if (lvcc == NULL || lvcc->tx.atmvcc == NULL || in iter_dequeue()
1751 __clear_bit(vci, lanai->backlog_vccs); in iter_dequeue()
1755 lvcc->tx.unqueue(lanai, lvcc, endptr); in iter_dequeue()
1765 if (lanai->conf1 & CONFIG1_POWERDOWN) in lanai_timed_poll()
1770 if (spin_trylock(&lanai->servicelock)) { in lanai_timed_poll()
1772 spin_unlock(&lanai->servicelock); in lanai_timed_poll()
1777 vci_bitfield_iterate(lanai, lanai->backlog_vccs, iter_dequeue); in lanai_timed_poll()
1783 mod_timer(&lanai->timer, jiffies + LANAI_POLL_PERIOD); in lanai_timed_poll()
1788 timer_setup(&lanai->timer, lanai_timed_poll, 0); in lanai_timed_poll_start()
1789 lanai->timer.expires = jiffies + LANAI_POLL_PERIOD; in lanai_timed_poll_start()
1790 add_timer(&lanai->timer); in lanai_timed_poll_start()
1795 del_timer_sync(&lanai->timer); in lanai_timed_poll_stop()
1798 /* -------------------- INTERRUPT SERVICE: */
1805 spin_lock(&lanai->servicelock); in lanai_int_1()
1807 spin_unlock(&lanai->servicelock); in lanai_int_1()
1825 printk(KERN_ERR DEV_LABEL "(itf %d): driver error - DMA " in lanai_int_1()
1827 lanai->number, (unsigned int) (reason & INT_DMASHUT), in lanai_int_1()
1834 printk(KERN_ERR DEV_LABEL "(itf %d): re-enabling DMA\n", in lanai_int_1()
1835 lanai->number); in lanai_int_1()
1837 lanai->stats.dma_reenable++; in lanai_int_1()
1843 lanai->number); in lanai_int_1()
1847 printk(KERN_ERR DEV_LABEL "(itf %d): driver error - " in lanai_int_1()
1848 "segmentation shutdown, reason=0x%08X\n", lanai->number, in lanai_int_1()
1854 printk(KERN_ERR DEV_LABEL "(itf %d): driver error - " in lanai_int_1()
1856 lanai->number, in lanai_int_1()
1880 * If we're powered down we shouldn't be generating any interrupts - in lanai_int()
1884 if (unlikely(lanai->conf1 & CONFIG1_POWERDOWN)) in lanai_int()
1902 /* TODO - it would be nice if we could use the "delayed interrupt" system
1906 /* -------------------- CHECK BOARD ID/REV: */
1910 * in the PCI configuration space - the documentation says to check
1919 printk(KERN_ERR DEV_LABEL ": Found %s board-id %d -- not a " in check_board_id_and_rev()
1921 return -ENODEV; in check_board_id_and_rev()
1928 /* -------------------- PCI INITIALIZATION/SHUTDOWN: */
1932 struct pci_dev *pci = lanai->pci; in lanai_pci_start()
1937 "PCI device", lanai->number); in lanai_pci_start()
1938 return -ENXIO; in lanai_pci_start()
1941 if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32)) != 0) { in lanai_pci_start()
1943 "(itf %d): No suitable DMA available.\n", lanai->number); in lanai_pci_start()
1944 return -EBUSY; in lanai_pci_start()
1946 result = check_board_id_and_rev("PCI", pci->subsystem_device, NULL); in lanai_pci_start()
1953 "PCI_LATENCY_TIMER: %d\n", lanai->number, result); in lanai_pci_start()
1954 return -EINVAL; in lanai_pci_start()
1961 /* -------------------- VPI/VCI ALLOCATION: */
1966 * AAL0 traffic (since they will use the same queue) - according to the
1972 if (qos->txtp.traffic_class == ATM_CBR || qos->aal == ATM_AAL0) in vci0_is_ok()
1974 if (qos->rxtp.traffic_class != ATM_NONE) { in vci0_is_ok()
1975 if (lanai->naal0 != 0) in vci0_is_ok()
1977 lanai->conf2 |= CONFIG2_VCI0_NORMAL; in vci0_is_ok()
1989 const struct atm_qos *qos = &atmvcc->qos; in vci_is_ok()
1990 const struct lanai_vcc *lvcc = lanai->vccs[vci]; in vci_is_ok()
1994 if (qos->rxtp.traffic_class != ATM_NONE && in vci_is_ok()
1995 lvcc->rx.atmvcc != NULL && lvcc->rx.atmvcc != atmvcc) in vci_is_ok()
1997 if (qos->txtp.traffic_class != ATM_NONE && in vci_is_ok()
1998 lvcc->tx.atmvcc != NULL && lvcc->tx.atmvcc != atmvcc) in vci_is_ok()
2000 if (qos->txtp.traffic_class == ATM_CBR && in vci_is_ok()
2001 lanai->cbrvcc != NULL && lanai->cbrvcc != atmvcc) in vci_is_ok()
2004 if (qos->aal == ATM_AAL0 && lanai->naal0 == 0 && in vci_is_ok()
2005 qos->rxtp.traffic_class != ATM_NONE) { in vci_is_ok()
2006 const struct lanai_vcc *vci0 = lanai->vccs[0]; in vci_is_ok()
2007 if (vci0 != NULL && vci0->rx.atmvcc != NULL) in vci_is_ok()
2009 lanai->conf2 &= ~CONFIG2_VCI0_NORMAL; in vci_is_ok()
2025 return -EADDRINUSE; in lanai_normalize_ci()
2029 for (*vcip = ATM_NOT_RSV_VCI; *vcip < lanai->num_vci; in lanai_normalize_ci()
2033 return -EADDRINUSE; in lanai_normalize_ci()
2035 if (*vcip >= lanai->num_vci || *vcip < 0 || in lanai_normalize_ci()
2037 return -EADDRINUSE; in lanai_normalize_ci()
2042 /* -------------------- MANAGE CBR: */
2045 * CBR ICG is stored as a fixed-point number with 4 fractional bits.
2058 * ICG = MAXPCR/PCR - 1
2059 * ICG = (3125<<9)/(27*PCR) - 1
2060 * ICG = ((3125<<9) - (27*PCR)) / (27*PCR)
2062 * The end result is supposed to be a fixed-point number with FRAC_BITS
2070 int x, icg, pcr = atm_pcr_goal(&qos->txtp); in pcr_to_cbricg()
2075 pcr = -pcr; in pcr_to_cbricg()
2078 icg = (3125 << (9 + CBRICG_FRAC_BITS)) - (x << CBRICG_FRAC_BITS); in pcr_to_cbricg()
2080 icg += x - 1; in pcr_to_cbricg()
2091 reg_write(lanai, pcr_to_cbricg(&lanai->cbrvcc->qos), CBR_ICG_Reg); in lanai_cbr_setup()
2092 reg_write(lanai, lanai->cbrvcc->vci, CBR_PTR_Reg); in lanai_cbr_setup()
2093 lanai->conf2 |= CONFIG2_CBR_ENABLE; in lanai_cbr_setup()
2099 lanai->conf2 &= ~CONFIG2_CBR_ENABLE; in lanai_cbr_shutdown()
2103 /* -------------------- OPERATIONS: */
2108 struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data; in lanai_dev_open()
2114 lanai->number = atmdev->number; in lanai_dev_open()
2115 lanai->num_vci = NUM_VCI; in lanai_dev_open()
2116 bitmap_zero(lanai->backlog_vccs, NUM_VCI); in lanai_dev_open()
2117 bitmap_zero(lanai->transmit_ready, NUM_VCI); in lanai_dev_open()
2118 lanai->naal0 = 0; in lanai_dev_open()
2120 lanai->nbound = 0; in lanai_dev_open()
2122 lanai->cbrvcc = NULL; in lanai_dev_open()
2123 memset(&lanai->stats, 0, sizeof lanai->stats); in lanai_dev_open()
2124 spin_lock_init(&lanai->endtxlock); in lanai_dev_open()
2125 spin_lock_init(&lanai->servicelock); in lanai_dev_open()
2126 atmdev->ci_range.vpi_bits = 0; in lanai_dev_open()
2127 atmdev->ci_range.vci_bits = 0; in lanai_dev_open()
2128 while (1 << atmdev->ci_range.vci_bits < lanai->num_vci) in lanai_dev_open()
2129 atmdev->ci_range.vci_bits++; in lanai_dev_open()
2130 atmdev->link_rate = ATM_25_PCR; in lanai_dev_open()
2135 raw_base = lanai->pci->resource[0].start; in lanai_dev_open()
2136 lanai->base = (bus_addr_t) ioremap(raw_base, LANAI_MAPPING_SIZE); in lanai_dev_open()
2137 if (lanai->base == NULL) { in lanai_dev_open()
2139 result = -ENOMEM; in lanai_dev_open()
2144 lanai->conf1 = reg_read(lanai, Config1_Reg); in lanai_dev_open()
2145 lanai->conf1 &= ~(CONFIG1_GPOUT1 | CONFIG1_POWERDOWN | in lanai_dev_open()
2147 lanai->conf1 |= CONFIG1_SET_LEDMODE(LEDMODE_NOT_SOOL); in lanai_dev_open()
2148 reg_write(lanai, lanai->conf1 | CONFIG1_GPOUT1, Config1_Reg); in lanai_dev_open()
2153 * 3.4: Turn on endian mode for big-endian hardware in lanai_dev_open()
2154 * We don't actually want to do this - the actual bit fields in lanai_dev_open()
2156 * Instead we do the bit-flipping ourselves on big-endian in lanai_dev_open()
2162 reg_read(lanai, Reset_Reg), &lanai->board_rev); in lanai_dev_open()
2172 /* 3.7: re-reset PHY, do loopback tests, setup PHY */ in lanai_dev_open()
2173 reg_write(lanai, lanai->conf1 | CONFIG1_GPOUT1, Config1_Reg); in lanai_dev_open()
2176 /* TODO - loopback tests */ in lanai_dev_open()
2177 lanai->conf1 |= (CONFIG1_GPOUT2 | CONFIG1_GPOUT3 | CONFIG1_DMA_ENABLE); in lanai_dev_open()
2185 lanai->conf1 |= CONFIG1_DMA_ENABLE; in lanai_dev_open()
2191 lanai->conf2 = (lanai->num_vci >= 512 ? CONFIG2_HOWMANY : 0) | in lanai_dev_open()
2196 if ((result = request_irq(lanai->pci->irq, lanai_int, IRQF_SHARED, in lanai_dev_open()
2204 lanai->conf1 = (lanai->conf1 & ~CONFIG1_MASK_LOOPMODE) | in lanai_dev_open()
2208 lanai->status = reg_read(lanai, Status_Reg); in lanai_dev_open()
2211 lanai->conf1 |= CONFIG1_POWERDOWN; in lanai_dev_open()
2214 memcpy(atmdev->esi, eeprom_mac(lanai), ESI_LEN); in lanai_dev_open()
2217 "(%pMF)\n", lanai->number, (int) lanai->pci->revision, in lanai_dev_open()
2218 lanai->base, lanai->pci->irq, atmdev->esi); in lanai_dev_open()
2220 "board_rev=%d\n", lanai->number, in lanai_dev_open()
2221 lanai->type==lanai2 ? "2" : "HB", (unsigned int) lanai->serialno, in lanai_dev_open()
2222 (unsigned int) lanai->serialno, lanai->board_rev); in lanai_dev_open()
2232 lanai->conf1 = reg_read(lanai, Config1_Reg) | CONFIG1_POWERDOWN; in lanai_dev_open()
2235 iounmap(lanai->base); in lanai_dev_open()
2236 lanai->base = NULL; in lanai_dev_open()
2238 pci_disable_device(lanai->pci); in lanai_dev_open()
2243 /* called when device is being shutdown, and all vcc's are gone - higher
2248 struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data; in lanai_dev_close()
2249 if (lanai->base==NULL) in lanai_dev_close()
2252 lanai->number); in lanai_dev_close()
2255 lanai->conf1 = reg_read(lanai, Config1_Reg) & ~CONFIG1_POWERDOWN; in lanai_dev_close()
2259 free_irq(lanai->pci->irq, lanai); in lanai_dev_close()
2262 lanai->conf1 |= CONFIG1_POWERDOWN; in lanai_dev_close()
2265 pci_disable_device(lanai->pci); in lanai_dev_close()
2268 iounmap(lanai->base); in lanai_dev_close()
2275 struct lanai_vcc *lvcc = (struct lanai_vcc *) atmvcc->dev_data; in lanai_close()
2276 struct lanai_dev *lanai = (struct lanai_dev *) atmvcc->dev->dev_data; in lanai_close()
2279 clear_bit(ATM_VF_READY, &atmvcc->flags); in lanai_close()
2280 clear_bit(ATM_VF_PARTIAL, &atmvcc->flags); in lanai_close()
2281 if (lvcc->rx.atmvcc == atmvcc) { in lanai_close()
2283 if (atmvcc->qos.aal == ATM_AAL0) { in lanai_close()
2284 if (--lanai->naal0 <= 0) in lanai_close()
2287 lanai_buf_deallocate(&lvcc->rx.buf, lanai->pci); in lanai_close()
2288 lvcc->rx.atmvcc = NULL; in lanai_close()
2290 if (lvcc->tx.atmvcc == atmvcc) { in lanai_close()
2291 if (atmvcc == lanai->cbrvcc) { in lanai_close()
2292 if (lvcc->vbase != NULL) in lanai_close()
2294 lanai->cbrvcc = NULL; in lanai_close()
2297 lanai_buf_deallocate(&lvcc->tx.buf, lanai->pci); in lanai_close()
2298 lvcc->tx.atmvcc = NULL; in lanai_close()
2300 if (--lvcc->nref == 0) { in lanai_close()
2304 atmvcc->dev_data = NULL; in lanai_close()
2305 clear_bit(ATM_VF_ADDR, &atmvcc->flags); in lanai_close()
2314 int vci = atmvcc->vci; in lanai_open()
2315 short vpi = atmvcc->vpi; in lanai_open()
2316 /* we don't support partial open - it's not really useful anyway */ in lanai_open()
2317 if ((test_bit(ATM_VF_PARTIAL, &atmvcc->flags)) || in lanai_open()
2319 return -EINVAL; in lanai_open()
2320 lanai = (struct lanai_dev *) atmvcc->dev->dev_data; in lanai_open()
2324 set_bit(ATM_VF_ADDR, &atmvcc->flags); in lanai_open()
2325 if (atmvcc->qos.aal != ATM_AAL0 && atmvcc->qos.aal != ATM_AAL5) in lanai_open()
2326 return -EINVAL; in lanai_open()
2327 DPRINTK(DEV_LABEL "(itf %d): open %d.%d\n", lanai->number, in lanai_open()
2329 lvcc = lanai->vccs[vci]; in lanai_open()
2333 return -ENOMEM; in lanai_open()
2334 atmvcc->dev_data = lvcc; in lanai_open()
2336 lvcc->nref++; in lanai_open()
2337 if (atmvcc->qos.rxtp.traffic_class != ATM_NONE) { in lanai_open()
2338 APRINTK(lvcc->rx.atmvcc == NULL, "rx.atmvcc!=NULL, vci=%d\n", in lanai_open()
2340 if (atmvcc->qos.aal == ATM_AAL0) { in lanai_open()
2341 if (lanai->naal0 == 0) in lanai_open()
2345 lanai, lvcc, &atmvcc->qos); in lanai_open()
2348 lvcc->rx.atmvcc = atmvcc; in lanai_open()
2349 lvcc->stats.rx_nomem = 0; in lanai_open()
2350 lvcc->stats.x.aal5.rx_badlen = 0; in lanai_open()
2351 lvcc->stats.x.aal5.service_trash = 0; in lanai_open()
2352 lvcc->stats.x.aal5.service_stream = 0; in lanai_open()
2353 lvcc->stats.x.aal5.service_rxcrc = 0; in lanai_open()
2354 if (atmvcc->qos.aal == ATM_AAL0) in lanai_open()
2355 lanai->naal0++; in lanai_open()
2357 if (atmvcc->qos.txtp.traffic_class != ATM_NONE) { in lanai_open()
2358 APRINTK(lvcc->tx.atmvcc == NULL, "tx.atmvcc!=NULL, vci=%d\n", in lanai_open()
2360 result = lanai_setup_tx_vci(lanai, lvcc, &atmvcc->qos); in lanai_open()
2363 lvcc->tx.atmvcc = atmvcc; in lanai_open()
2364 if (atmvcc->qos.txtp.traffic_class == ATM_CBR) { in lanai_open()
2365 APRINTK(lanai->cbrvcc == NULL, in lanai_open()
2367 lanai->cbrvcc = atmvcc; in lanai_open()
2376 if (atmvcc == lvcc->rx.atmvcc) in lanai_open()
2378 if (atmvcc == lvcc->tx.atmvcc) { in lanai_open()
2380 if (lanai->cbrvcc == atmvcc) in lanai_open()
2383 set_bit(ATM_VF_READY, &atmvcc->flags); in lanai_open()
2393 struct lanai_vcc *lvcc = (struct lanai_vcc *) atmvcc->dev_data; in lanai_send()
2394 struct lanai_dev *lanai = (struct lanai_dev *) atmvcc->dev->dev_data; in lanai_send()
2396 if (unlikely(lvcc == NULL || lvcc->vbase == NULL || in lanai_send()
2397 lvcc->tx.atmvcc != atmvcc)) in lanai_send()
2401 DPRINTK("lanai_send: skb==NULL for vci=%d\n", atmvcc->vci); in lanai_send()
2405 DPRINTK("lanai_send: lanai==NULL for vci=%d\n", atmvcc->vci); in lanai_send()
2409 ATM_SKB(skb)->vcc = atmvcc; in lanai_send()
2410 switch (atmvcc->qos.aal) { in lanai_send()
2417 if (unlikely(skb->len != ATM_CELL_SIZE-1)) in lanai_send()
2419 /* NOTE - this next line is technically invalid - we haven't unshared skb */ in lanai_send()
2420 cpu_to_be32s((u32 *) skb->data); in lanai_send()
2426 DPRINTK("lanai_send: bad aal=%d on vci=%d\n", (int) atmvcc->qos.aal, in lanai_send()
2427 atmvcc->vci); in lanai_send()
2430 return -EINVAL; in lanai_send()
2436 return -EBUSY; /* TODO: need to write this */ in lanai_change_qos()
2444 struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data; in lanai_proc_read()
2447 if (left-- == 0) in lanai_proc_read()
2450 atmdev->number, lanai->type==lanai2 ? "2" : "HB", in lanai_proc_read()
2451 (unsigned int) lanai->serialno, in lanai_proc_read()
2452 (unsigned int) lanai->magicno, lanai->num_vci); in lanai_proc_read()
2453 if (left-- == 0) in lanai_proc_read()
2455 lanai->board_rev, (int) lanai->pci->revision); in lanai_proc_read()
2456 if (left-- == 0) in lanai_proc_read()
2458 &lanai->eeprom[EEPROM_MAC]); in lanai_proc_read()
2459 if (left-- == 0) in lanai_proc_read()
2461 "GPIN=%d\n", (lanai->status & STATUS_SOOL) ? 1 : 0, in lanai_proc_read()
2462 (lanai->status & STATUS_LOCD) ? 1 : 0, in lanai_proc_read()
2463 (lanai->status & STATUS_LED) ? 1 : 0, in lanai_proc_read()
2464 (lanai->status & STATUS_GPIN) ? 1 : 0); in lanai_proc_read()
2465 if (left-- == 0) in lanai_proc_read()
2467 "aal0_rx=%zu\n", lanai_buf_size(&lanai->service), in lanai_proc_read()
2468 lanai->naal0 ? lanai_buf_size(&lanai->aal0buf) : 0); in lanai_proc_read()
2469 if (left-- == 0) { in lanai_proc_read()
2473 lanai->stats.ovfl_trash, lanai->stats.vci_trash, in lanai_proc_read()
2474 lanai->stats.hec_err, lanai->stats.atm_ovfl); in lanai_proc_read()
2476 if (left-- == 0) in lanai_proc_read()
2479 lanai->stats.pcierr_parity_detect, in lanai_proc_read()
2480 lanai->stats.pcierr_serr_set, in lanai_proc_read()
2481 lanai->stats.pcierr_m_target_abort); in lanai_proc_read()
2482 if (left-- == 0) in lanai_proc_read()
2484 "master_parity=%u\n", lanai->stats.pcierr_s_target_abort, in lanai_proc_read()
2485 lanai->stats.pcierr_master_parity); in lanai_proc_read()
2486 if (left-- == 0) in lanai_proc_read()
2488 "no_rx=%u, bad_rx_aal=%u\n", lanai->stats.service_norx, in lanai_proc_read()
2489 lanai->stats.service_notx, in lanai_proc_read()
2490 lanai->stats.service_rxnotaal5); in lanai_proc_read()
2491 if (left-- == 0) in lanai_proc_read()
2493 lanai->stats.dma_reenable, lanai->stats.card_reset); in lanai_proc_read()
2501 if ((lvcc = lanai->vccs[left]) != NULL) in lanai_proc_read()
2505 /* Note that we re-use "left" here since we're done with it */ in lanai_proc_read()
2507 lvcc->nref, lvcc->stats.rx_nomem); in lanai_proc_read()
2508 if (lvcc->rx.atmvcc != NULL) { in lanai_proc_read()
2510 lvcc->rx.atmvcc->qos.aal == ATM_AAL5 ? 5 : 0); in lanai_proc_read()
2511 if (lvcc->rx.atmvcc->qos.aal == ATM_AAL5) in lanai_proc_read()
2515 lanai_buf_size(&lvcc->rx.buf), in lanai_proc_read()
2516 lvcc->stats.x.aal5.rx_badlen, in lanai_proc_read()
2517 lvcc->stats.x.aal5.service_trash, in lanai_proc_read()
2518 lvcc->stats.x.aal5.service_stream, in lanai_proc_read()
2519 lvcc->stats.x.aal5.service_rxcrc); in lanai_proc_read()
2521 if (lvcc->tx.atmvcc != NULL) in lanai_proc_read()
2524 lvcc->tx.atmvcc->qos.aal == ATM_AAL5 ? 5 : 0, in lanai_proc_read()
2525 lanai_buf_size(&lvcc->tx.buf), in lanai_proc_read()
2526 lvcc->tx.atmvcc == lanai->cbrvcc ? 'C' : 'U', in lanai_proc_read()
2536 /* -------------------- HOOKS: */
2562 return -ENOMEM; in lanai_init_one()
2565 atmdev = atm_dev_register(DEV_LABEL, &pci->dev, &ops, -1, NULL); in lanai_init_one()
2570 return -EBUSY; in lanai_init_one()
2573 atmdev->dev_data = lanai; in lanai_init_one()
2574 lanai->pci = pci; in lanai_init_one()
2575 lanai->type = (enum lanai_type) ident->device; in lanai_init_one()
2579 DPRINTK("lanai_start() failed, err=%d\n", -result); in lanai_init_one()