Lines Matching refs:lanai

306 static void vci_bitfield_iterate(struct lanai_dev *lanai,  in vci_bitfield_iterate()  argument
313 func(lanai, vci); in vci_bitfield_iterate()
472 static inline bus_addr_t reg_addr(const struct lanai_dev *lanai, in reg_addr() argument
475 return lanai->base + reg; in reg_addr()
478 static inline u32 reg_read(const struct lanai_dev *lanai, in reg_read() argument
482 t = readl(reg_addr(lanai, reg)); in reg_read()
483 RWDEBUG("R [0x%08X] 0x%02X = 0x%08X\n", (unsigned int) lanai->base, in reg_read()
488 static inline void reg_write(const struct lanai_dev *lanai, u32 val, in reg_write() argument
491 RWDEBUG("W [0x%08X] 0x%02X < 0x%08X\n", (unsigned int) lanai->base, in reg_write()
493 writel(val, reg_addr(lanai, reg)); in reg_write()
496 static inline void conf1_write(const struct lanai_dev *lanai) in conf1_write() argument
498 reg_write(lanai, lanai->conf1, Config1_Reg); in conf1_write()
501 static inline void conf2_write(const struct lanai_dev *lanai) in conf2_write() argument
503 reg_write(lanai, lanai->conf2, Config2_Reg); in conf2_write()
507 static inline void conf2_write_if_powerup(const struct lanai_dev *lanai) in conf2_write_if_powerup() argument
510 if (unlikely((lanai->conf1 & CONFIG1_POWERDOWN) != 0)) in conf2_write_if_powerup()
513 conf2_write(lanai); in conf2_write_if_powerup()
516 static inline void reset_board(const struct lanai_dev *lanai) in reset_board() argument
519 reg_write(lanai, 0, Reset_Reg); in reset_board()
539 static inline bus_addr_t sram_addr(const struct lanai_dev *lanai, int offset) in sram_addr() argument
541 return lanai->base + SRAM_START + offset; in sram_addr()
544 static inline u32 sram_read(const struct lanai_dev *lanai, int offset) in sram_read() argument
546 return readl(sram_addr(lanai, offset)); in sram_read()
549 static inline void sram_write(const struct lanai_dev *lanai, in sram_write() argument
552 writel(val, sram_addr(lanai, offset)); in sram_write()
555 static int sram_test_word(const struct lanai_dev *lanai, int offset, in sram_test_word() argument
559 sram_write(lanai, pattern, offset); in sram_test_word()
560 readback = sram_read(lanai, offset); in sram_test_word()
565 lanai->number, offset, in sram_test_word()
570 static int sram_test_pass(const struct lanai_dev *lanai, u32 pattern) in sram_test_pass() argument
574 result = sram_test_word(lanai, offset, pattern); in sram_test_pass()
578 static int sram_test_and_clear(const struct lanai_dev *lanai) in sram_test_and_clear() argument
583 if ((result = sram_test_pass(lanai, 0x5555)) != 0) in sram_test_and_clear()
585 if ((result = sram_test_pass(lanai, 0xAAAA)) != 0) in sram_test_and_clear()
589 return sram_test_pass(lanai, 0x0000); in sram_test_and_clear()
644 static inline bus_addr_t cardvcc_addr(const struct lanai_dev *lanai, in cardvcc_addr() argument
647 return sram_addr(lanai, vci * CARDVCC_SIZE); in cardvcc_addr()
766 static void lanai_shutdown_tx_vci(struct lanai_dev *lanai, in lanai_shutdown_tx_vci() argument
780 __clear_bit(lvcc->vci, lanai->backlog_vccs); in lanai_shutdown_tx_vci()
822 static inline int aal0_buffer_allocate(struct lanai_dev *lanai) in aal0_buffer_allocate() argument
825 lanai_buf_allocate(&lanai->aal0buf, AAL0_RX_BUFFER_SIZE, 80, in aal0_buffer_allocate()
826 lanai->pci); in aal0_buffer_allocate()
827 return (lanai->aal0buf.start == NULL) ? -ENOMEM : 0; in aal0_buffer_allocate()
830 static inline void aal0_buffer_free(struct lanai_dev *lanai) in aal0_buffer_free() argument
833 lanai_buf_deallocate(&lanai->aal0buf, lanai->pci); in aal0_buffer_free()
855 static int eeprom_read(struct lanai_dev *lanai) in eeprom_read() argument
858 lanai->number); in eeprom_read()
859 memset(&lanai->eeprom[EEPROM_MAC], 0, 6); in eeprom_read()
863 static int eeprom_validate(struct lanai_dev *lanai) in eeprom_validate() argument
865 lanai->serialno = 0; in eeprom_validate()
866 lanai->magicno = EEPROM_MAGIC_VALUE; in eeprom_validate()
872 static int eeprom_read(struct lanai_dev *lanai) in eeprom_read() argument
877 #define set_config1(x) do { lanai->conf1 = x; conf1_write(lanai); \ in eeprom_read()
879 #define clock_h() set_config1(lanai->conf1 | CONFIG1_PROMCLK) in eeprom_read()
880 #define clock_l() set_config1(lanai->conf1 &~ CONFIG1_PROMCLK) in eeprom_read()
881 #define data_h() set_config1(lanai->conf1 | CONFIG1_PROMDATA) in eeprom_read()
882 #define data_l() set_config1(lanai->conf1 &~ CONFIG1_PROMDATA) in eeprom_read()
884 #define read_pin() (reg_read(lanai, Status_Reg) & STATUS_PROMDATA) in eeprom_read()
895 tmp = (lanai->conf1 & ~CONFIG1_PROMDATA) | in eeprom_read()
897 if (lanai->conf1 != tmp) { in eeprom_read()
920 lanai->eeprom[address] = data; in eeprom_read()
929 lanai->number, address); in eeprom_read()
942 static inline u32 eeprom_be4(const struct lanai_dev *lanai, int address) in eeprom_be4() argument
944 return be32_to_cpup((const u32 *) &lanai->eeprom[address]); in eeprom_be4()
948 static int eeprom_validate(struct lanai_dev *lanai) in eeprom_validate() argument
952 const u8 *e = lanai->eeprom; in eeprom_validate()
972 "(wanted 0x%02X, got 0x%02X)\n", lanai->number, in eeprom_validate()
979 "bad (wanted 0x%02X, got 0x%02X)\n", lanai->number, in eeprom_validate()
988 "(0x%02X, inverse 0x%02X)\n", lanai->number, in eeprom_validate()
995 lanai->serialno = eeprom_be4(lanai, EEPROM_SERIAL); in eeprom_validate()
996 v = eeprom_be4(lanai, EEPROM_SERIAL_REV); in eeprom_validate()
997 if ((lanai->serialno ^ v) != 0xFFFFFFFF) { in eeprom_validate()
999 "don't match (0x%08X, inverse 0x%08X)\n", lanai->number, in eeprom_validate()
1000 (unsigned int) lanai->serialno, (unsigned int) v); in eeprom_validate()
1003 DPRINTK("eeprom: Serial number = %d\n", (unsigned int) lanai->serialno); in eeprom_validate()
1005 lanai->magicno = eeprom_be4(lanai, EEPROM_MAGIC); in eeprom_validate()
1006 v = eeprom_be4(lanai, EEPROM_MAGIC_REV); in eeprom_validate()
1007 if ((lanai->magicno ^ v) != 0xFFFFFFFF) { in eeprom_validate()
1009 "don't match (0x%08X, inverse 0x%08X)\n", lanai->number, in eeprom_validate()
1010 lanai->magicno, v); in eeprom_validate()
1013 DPRINTK("eeprom: Magic number = 0x%08X\n", lanai->magicno); in eeprom_validate()
1014 if (lanai->magicno != EEPROM_MAGIC_VALUE) in eeprom_validate()
1017 lanai->number, (unsigned int) lanai->magicno, in eeprom_validate()
1024 static inline const u8 *eeprom_mac(const struct lanai_dev *lanai) in eeprom_mac() argument
1026 return &lanai->eeprom[EEPROM_MAC]; in eeprom_mac()
1056 static inline u32 intr_pending(const struct lanai_dev *lanai) in intr_pending() argument
1058 return reg_read(lanai, IntStatusMasked_Reg); in intr_pending()
1061 static inline void intr_enable(const struct lanai_dev *lanai, u32 i) in intr_enable() argument
1063 reg_write(lanai, i, IntControlEna_Reg); in intr_enable()
1066 static inline void intr_disable(const struct lanai_dev *lanai, u32 i) in intr_disable() argument
1068 reg_write(lanai, i, IntControlDis_Reg); in intr_disable()
1080 static void lanai_check_status(struct lanai_dev *lanai) in lanai_check_status() argument
1082 u32 new = reg_read(lanai, Status_Reg); in lanai_check_status()
1083 u32 changes = new ^ lanai->status; in lanai_check_status()
1084 lanai->status = new; in lanai_check_status()
1087 status_message(lanai->number, name, new & flag) in lanai_check_status()
1100 static void pcistatus_check(struct lanai_dev *lanai, int clearonly) in pcistatus_check() argument
1104 result = pci_read_config_word(lanai->pci, PCI_STATUS, &s); in pcistatus_check()
1107 "%d\n", lanai->number, result); in pcistatus_check()
1115 result = pci_write_config_word(lanai->pci, PCI_STATUS, s); in pcistatus_check()
1118 "%d\n", lanai->number, result); in pcistatus_check()
1123 pcistatus_got(lanai->number, name); \ in pcistatus_check()
1124 ++lanai->stats.pcierr_##stat; \ in pcistatus_check()
1237 static inline void lanai_endtx(struct lanai_dev *lanai, in lanai_endtx() argument
1253 spin_lock(&lanai->endtxlock); in lanai_endtx()
1260 for (i = 0; reg_read(lanai, Status_Reg) & STATUS_BUTTBUSY; i++) { in lanai_endtx()
1263 "always busy!\n", lanai->number); in lanai_endtx()
1274 reg_write(lanai, (ptr << 12) | lvcc->vci, Butt_Reg); in lanai_endtx()
1275 spin_unlock(&lanai->endtxlock); in lanai_endtx()
1282 static void lanai_send_one_aal5(struct lanai_dev *lanai, in lanai_send_one_aal5() argument
1296 lanai_endtx(lanai, lvcc); in lanai_send_one_aal5()
1302 static void vcc_tx_unqueue_aal5(struct lanai_dev *lanai, in vcc_tx_unqueue_aal5() argument
1321 lanai_send_one_aal5(lanai, lvcc, skb, n); in vcc_tx_unqueue_aal5()
1326 __clear_bit(lvcc->vci, lanai->backlog_vccs); in vcc_tx_unqueue_aal5()
1331 static void vcc_tx_aal5(struct lanai_dev *lanai, struct lanai_vcc *lvcc, in vcc_tx_aal5() argument
1342 __set_bit(lvcc->vci, lanai->backlog_vccs); in vcc_tx_aal5()
1347 lanai_send_one_aal5(lanai, lvcc, skb, n); in vcc_tx_aal5()
1350 static void vcc_tx_unqueue_aal0(struct lanai_dev *lanai, in vcc_tx_unqueue_aal0() argument
1357 static void vcc_tx_aal0(struct lanai_dev *lanai, struct lanai_vcc *lvcc, in vcc_tx_aal0() argument
1427 static void vcc_rx_aal0(struct lanai_dev *lanai) in vcc_rx_aal0() argument
1443 static int vcc_table_allocate(struct lanai_dev *lanai) in vcc_table_allocate() argument
1446 APRINTK((lanai->num_vci) * sizeof(struct lanai_vcc *) <= PAGE_SIZE, in vcc_table_allocate()
1448 lanai->vccs = (struct lanai_vcc **) get_zeroed_page(GFP_KERNEL); in vcc_table_allocate()
1449 return (lanai->vccs == NULL) ? -ENOMEM : 0; in vcc_table_allocate()
1451 int bytes = (lanai->num_vci) * sizeof(struct lanai_vcc *); in vcc_table_allocate()
1452 lanai->vccs = vzalloc(bytes); in vcc_table_allocate()
1453 if (unlikely(lanai->vccs == NULL)) in vcc_table_allocate()
1459 static inline void vcc_table_deallocate(const struct lanai_dev *lanai) in vcc_table_deallocate() argument
1462 free_page((unsigned long) lanai->vccs); in vcc_table_deallocate()
1464 vfree(lanai->vccs); in vcc_table_deallocate()
1482 static int lanai_get_sized_buffer(struct lanai_dev *lanai, in lanai_get_sized_buffer() argument
1491 lanai_buf_allocate(buf, size, max_sdu + 32, lanai->pci); in lanai_get_sized_buffer()
1496 "for %s buffer, got only %Zu\n", lanai->number, size, in lanai_get_sized_buffer()
1503 static inline int lanai_setup_rx_vci_aal5(struct lanai_dev *lanai, in lanai_setup_rx_vci_aal5() argument
1506 return lanai_get_sized_buffer(lanai, &lvcc->rx.buf, in lanai_setup_rx_vci_aal5()
1511 static int lanai_setup_tx_vci(struct lanai_dev *lanai, struct lanai_vcc *lvcc, in lanai_setup_tx_vci() argument
1524 return lanai_get_sized_buffer(lanai, &lvcc->tx.buf, max_sdu, in lanai_setup_tx_vci()
1528 static inline void host_vcc_bind(struct lanai_dev *lanai, in host_vcc_bind() argument
1535 if (lanai->nbound++ == 0) { in host_vcc_bind()
1537 lanai->conf1 &= ~CONFIG1_POWERDOWN; in host_vcc_bind()
1538 conf1_write(lanai); in host_vcc_bind()
1539 conf2_write(lanai); in host_vcc_bind()
1542 lvcc->vbase = cardvcc_addr(lanai, vci); in host_vcc_bind()
1543 lanai->vccs[lvcc->vci = vci] = lvcc; in host_vcc_bind()
1546 static inline void host_vcc_unbind(struct lanai_dev *lanai, in host_vcc_unbind() argument
1553 lanai->vccs[lvcc->vci] = NULL; in host_vcc_unbind()
1555 if (--lanai->nbound == 0) { in host_vcc_unbind()
1557 lanai->conf1 |= CONFIG1_POWERDOWN; in host_vcc_unbind()
1558 conf1_write(lanai); in host_vcc_unbind()
1565 static void lanai_reset(struct lanai_dev *lanai) in lanai_reset() argument
1568 "implemented\n", lanai->number); in lanai_reset()
1574 reg_write(lanai, INT_ALL, IntAck_Reg); in lanai_reset()
1575 lanai->stats.card_reset++; in lanai_reset()
1583 static int service_buffer_allocate(struct lanai_dev *lanai) in service_buffer_allocate() argument
1585 lanai_buf_allocate(&lanai->service, SERVICE_ENTRIES * 4, 8, in service_buffer_allocate()
1586 lanai->pci); in service_buffer_allocate()
1587 if (unlikely(lanai->service.start == NULL)) in service_buffer_allocate()
1590 (unsigned long) lanai->service.start, in service_buffer_allocate()
1591 lanai_buf_size(&lanai->service), in service_buffer_allocate()
1592 lanai_buf_size_cardorder(&lanai->service)); in service_buffer_allocate()
1594 reg_write(lanai, 0, ServWrite_Reg); in service_buffer_allocate()
1596 reg_write(lanai, in service_buffer_allocate()
1597 SSTUFF_SET_SIZE(lanai_buf_size_cardorder(&lanai->service)) | in service_buffer_allocate()
1598 SSTUFF_SET_ADDR(lanai->service.dmaaddr), in service_buffer_allocate()
1603 static inline void service_buffer_deallocate(struct lanai_dev *lanai) in service_buffer_deallocate() argument
1605 lanai_buf_deallocate(&lanai->service, lanai->pci); in service_buffer_deallocate()
1621 static int handle_service(struct lanai_dev *lanai, u32 s) in handle_service() argument
1626 lvcc = lanai->vccs[vci]; in handle_service()
1630 "vcc %d\n", lanai->number, (unsigned int) s, vci); in handle_service()
1632 lanai->stats.service_notx++; in handle_service()
1634 lanai->stats.service_norx++; in handle_service()
1641 "vcc %d\n", lanai->number, (unsigned int) s, vci); in handle_service()
1642 lanai->stats.service_notx++; in handle_service()
1645 __set_bit(vci, lanai->transmit_ready); in handle_service()
1653 "vcc %d\n", lanai->number, (unsigned int) s, vci); in handle_service()
1654 lanai->stats.service_norx++; in handle_service()
1660 "vcc %d\n", lanai->number, (unsigned int) s, vci); in handle_service()
1661 lanai->stats.service_rxnotaal5++; in handle_service()
1681 lanai->stats.ovfl_trash += (bytes / 48); in handle_service()
1689 "PDU on VCI %d!\n", lanai->number, vci); in handle_service()
1690 lanai_reset(lanai); in handle_service()
1703 static void iter_transmit(struct lanai_dev *lanai, vci_t vci) in iter_transmit() argument
1705 struct lanai_vcc *lvcc = lanai->vccs[vci]; in iter_transmit()
1707 lvcc->tx.unqueue(lanai, lvcc, lvcc->tx.endptr); in iter_transmit()
1714 static void run_service(struct lanai_dev *lanai) in run_service() argument
1717 u32 wreg = reg_read(lanai, ServWrite_Reg); in run_service()
1718 const u32 *end = lanai->service.start + wreg; in run_service()
1719 while (lanai->service.ptr != end) { in run_service()
1720 ntx += handle_service(lanai, in run_service()
1721 le32_to_cpup(lanai->service.ptr++)); in run_service()
1722 if (lanai->service.ptr >= lanai->service.end) in run_service()
1723 lanai->service.ptr = lanai->service.start; in run_service()
1725 reg_write(lanai, wreg, ServRead_Reg); in run_service()
1728 vci_bitfield_iterate(lanai, lanai->transmit_ready, in run_service()
1730 bitmap_zero(lanai->transmit_ready, NUM_VCI); in run_service()
1737 static void get_statistics(struct lanai_dev *lanai) in get_statistics() argument
1739 u32 statreg = reg_read(lanai, Statistics_Reg); in get_statistics()
1740 lanai->stats.atm_ovfl += STATS_GET_FIFO_OVFL(statreg); in get_statistics()
1741 lanai->stats.hec_err += STATS_GET_HEC_ERR(statreg); in get_statistics()
1742 lanai->stats.vci_trash += STATS_GET_BAD_VCI(statreg); in get_statistics()
1743 lanai->stats.ovfl_trash += STATS_GET_BUF_OVFL(statreg); in get_statistics()
1750 static void iter_dequeue(struct lanai_dev *lanai, vci_t vci) in iter_dequeue() argument
1752 struct lanai_vcc *lvcc = lanai->vccs[vci]; in iter_dequeue()
1756 __clear_bit(vci, lanai->backlog_vccs); in iter_dequeue()
1760 lvcc->tx.unqueue(lanai, lvcc, endptr); in iter_dequeue()
1766 struct lanai_dev *lanai = (struct lanai_dev *) arg; in lanai_timed_poll() local
1770 if (lanai->conf1 & CONFIG1_POWERDOWN) in lanai_timed_poll()
1775 if (spin_trylock(&lanai->servicelock)) { in lanai_timed_poll()
1776 run_service(lanai); in lanai_timed_poll()
1777 spin_unlock(&lanai->servicelock); in lanai_timed_poll()
1782 vci_bitfield_iterate(lanai, lanai->backlog_vccs, iter_dequeue); in lanai_timed_poll()
1786 get_statistics(lanai); in lanai_timed_poll()
1788 mod_timer(&lanai->timer, jiffies + LANAI_POLL_PERIOD); in lanai_timed_poll()
1791 static inline void lanai_timed_poll_start(struct lanai_dev *lanai) in lanai_timed_poll_start() argument
1793 init_timer(&lanai->timer); in lanai_timed_poll_start()
1794 lanai->timer.expires = jiffies + LANAI_POLL_PERIOD; in lanai_timed_poll_start()
1795 lanai->timer.data = (unsigned long) lanai; in lanai_timed_poll_start()
1796 lanai->timer.function = lanai_timed_poll; in lanai_timed_poll_start()
1797 add_timer(&lanai->timer); in lanai_timed_poll_start()
1800 static inline void lanai_timed_poll_stop(struct lanai_dev *lanai) in lanai_timed_poll_stop() argument
1802 del_timer_sync(&lanai->timer); in lanai_timed_poll_stop()
1807 static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason) in lanai_int_1() argument
1812 spin_lock(&lanai->servicelock); in lanai_int_1()
1813 run_service(lanai); in lanai_int_1()
1814 spin_unlock(&lanai->servicelock); in lanai_int_1()
1818 vcc_rx_aal0(lanai); in lanai_int_1()
1825 get_statistics(lanai); in lanai_int_1()
1829 lanai_check_status(lanai); in lanai_int_1()
1834 lanai->number, (unsigned int) (reason & INT_DMASHUT), in lanai_int_1()
1835 (unsigned int) reg_read(lanai, DMA_Addr_Reg)); in lanai_int_1()
1837 lanai_reset(lanai); in lanai_int_1()
1842 lanai->number); in lanai_int_1()
1843 conf1_write(lanai); in lanai_int_1()
1844 lanai->stats.dma_reenable++; in lanai_int_1()
1845 pcistatus_check(lanai, 0); in lanai_int_1()
1850 lanai->number); in lanai_int_1()
1851 pcistatus_check(lanai, 0); in lanai_int_1()
1855 "segmentation shutdown, reason=0x%08X\n", lanai->number, in lanai_int_1()
1857 lanai_reset(lanai); in lanai_int_1()
1863 lanai->number, in lanai_int_1()
1865 lanai_reset(lanai); in lanai_int_1()
1877 reg_write(lanai, ack, IntAck_Reg); in lanai_int_1()
1882 struct lanai_dev *lanai = devid; in lanai_int() local
1891 if (unlikely(lanai->conf1 & CONFIG1_POWERDOWN)) in lanai_int()
1895 reason = intr_pending(lanai); in lanai_int()
1902 lanai_int_1(lanai, reason); in lanai_int()
1903 reason = intr_pending(lanai); in lanai_int()
1937 static int lanai_pci_start(struct lanai_dev *lanai) in lanai_pci_start() argument
1939 struct pci_dev *pci = lanai->pci; in lanai_pci_start()
1944 "PCI device", lanai->number); in lanai_pci_start()
1950 "(itf %d): No suitable DMA available.\n", lanai->number); in lanai_pci_start()
1960 "PCI_LATENCY_TIMER: %d\n", lanai->number, result); in lanai_pci_start()
1963 pcistatus_check(lanai, 1); in lanai_pci_start()
1964 pcistatus_check(lanai, 0); in lanai_pci_start()
1976 static inline int vci0_is_ok(struct lanai_dev *lanai, in vci0_is_ok() argument
1982 if (lanai->naal0 != 0) in vci0_is_ok()
1984 lanai->conf2 |= CONFIG2_VCI0_NORMAL; in vci0_is_ok()
1985 conf2_write_if_powerup(lanai); in vci0_is_ok()
1993 static int vci_is_ok(struct lanai_dev *lanai, vci_t vci, in vci_is_ok() argument
1997 const struct lanai_vcc *lvcc = lanai->vccs[vci]; in vci_is_ok()
1998 if (vci == 0 && !vci0_is_ok(lanai, qos)) in vci_is_ok()
2008 lanai->cbrvcc != NULL && lanai->cbrvcc != atmvcc) in vci_is_ok()
2011 if (qos->aal == ATM_AAL0 && lanai->naal0 == 0 && in vci_is_ok()
2013 const struct lanai_vcc *vci0 = lanai->vccs[0]; in vci_is_ok()
2016 lanai->conf2 &= ~CONFIG2_VCI0_NORMAL; in vci_is_ok()
2017 conf2_write_if_powerup(lanai); in vci_is_ok()
2022 static int lanai_normalize_ci(struct lanai_dev *lanai, in lanai_normalize_ci() argument
2036 for (*vcip = ATM_NOT_RSV_VCI; *vcip < lanai->num_vci; in lanai_normalize_ci()
2038 if (vci_is_ok(lanai, *vcip, atmvcc)) in lanai_normalize_ci()
2042 if (*vcip >= lanai->num_vci || *vcip < 0 || in lanai_normalize_ci()
2043 !vci_is_ok(lanai, *vcip, atmvcc)) in lanai_normalize_ci()
2096 static inline void lanai_cbr_setup(struct lanai_dev *lanai) in lanai_cbr_setup() argument
2098 reg_write(lanai, pcr_to_cbricg(&lanai->cbrvcc->qos), CBR_ICG_Reg); in lanai_cbr_setup()
2099 reg_write(lanai, lanai->cbrvcc->vci, CBR_PTR_Reg); in lanai_cbr_setup()
2100 lanai->conf2 |= CONFIG2_CBR_ENABLE; in lanai_cbr_setup()
2101 conf2_write(lanai); in lanai_cbr_setup()
2104 static inline void lanai_cbr_shutdown(struct lanai_dev *lanai) in lanai_cbr_shutdown() argument
2106 lanai->conf2 &= ~CONFIG2_CBR_ENABLE; in lanai_cbr_shutdown()
2107 conf2_write(lanai); in lanai_cbr_shutdown()
2115 struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data; in lanai_dev_open() local
2121 lanai->number = atmdev->number; in lanai_dev_open()
2122 lanai->num_vci = NUM_VCI; in lanai_dev_open()
2123 bitmap_zero(lanai->backlog_vccs, NUM_VCI); in lanai_dev_open()
2124 bitmap_zero(lanai->transmit_ready, NUM_VCI); in lanai_dev_open()
2125 lanai->naal0 = 0; in lanai_dev_open()
2127 lanai->nbound = 0; in lanai_dev_open()
2129 lanai->cbrvcc = NULL; in lanai_dev_open()
2130 memset(&lanai->stats, 0, sizeof lanai->stats); in lanai_dev_open()
2131 spin_lock_init(&lanai->endtxlock); in lanai_dev_open()
2132 spin_lock_init(&lanai->servicelock); in lanai_dev_open()
2135 while (1 << atmdev->ci_range.vci_bits < lanai->num_vci) in lanai_dev_open()
2140 if ((result = lanai_pci_start(lanai)) != 0) in lanai_dev_open()
2142 raw_base = lanai->pci->resource[0].start; in lanai_dev_open()
2143 lanai->base = (bus_addr_t) ioremap(raw_base, LANAI_MAPPING_SIZE); in lanai_dev_open()
2144 if (lanai->base == NULL) { in lanai_dev_open()
2149 reset_board(lanai); in lanai_dev_open()
2150 lanai->conf1 = reg_read(lanai, Config1_Reg); in lanai_dev_open()
2151 lanai->conf1 &= ~(CONFIG1_GPOUT1 | CONFIG1_POWERDOWN | in lanai_dev_open()
2153 lanai->conf1 |= CONFIG1_SET_LEDMODE(LEDMODE_NOT_SOOL); in lanai_dev_open()
2154 reg_write(lanai, lanai->conf1 | CONFIG1_GPOUT1, Config1_Reg); in lanai_dev_open()
2156 conf1_write(lanai); in lanai_dev_open()
2168 reg_read(lanai, Reset_Reg), &lanai->board_rev); in lanai_dev_open()
2173 if ((result = eeprom_read(lanai)) != 0) in lanai_dev_open()
2175 if ((result = eeprom_validate(lanai)) != 0) in lanai_dev_open()
2179 reg_write(lanai, lanai->conf1 | CONFIG1_GPOUT1, Config1_Reg); in lanai_dev_open()
2181 conf1_write(lanai); in lanai_dev_open()
2183 lanai->conf1 |= (CONFIG1_GPOUT2 | CONFIG1_GPOUT3 | CONFIG1_DMA_ENABLE); in lanai_dev_open()
2184 conf1_write(lanai); in lanai_dev_open()
2187 if ((result = sram_test_and_clear(lanai)) != 0) in lanai_dev_open()
2191 lanai->conf1 |= CONFIG1_DMA_ENABLE; in lanai_dev_open()
2192 conf1_write(lanai); in lanai_dev_open()
2193 if ((result = service_buffer_allocate(lanai)) != 0) in lanai_dev_open()
2195 if ((result = vcc_table_allocate(lanai)) != 0) in lanai_dev_open()
2197 lanai->conf2 = (lanai->num_vci >= 512 ? CONFIG2_HOWMANY : 0) | in lanai_dev_open()
2199 conf2_write(lanai); in lanai_dev_open()
2200 reg_write(lanai, TX_FIFO_DEPTH, TxDepth_Reg); in lanai_dev_open()
2201 reg_write(lanai, 0, CBR_ICG_Reg); /* CBR defaults to no limit */ in lanai_dev_open()
2202 if ((result = request_irq(lanai->pci->irq, lanai_int, IRQF_SHARED, in lanai_dev_open()
2203 DEV_LABEL, lanai)) != 0) { in lanai_dev_open()
2208 intr_enable(lanai, INT_ALL & ~(INT_PING | INT_WAKE)); in lanai_dev_open()
2210 lanai->conf1 = (lanai->conf1 & ~CONFIG1_MASK_LOOPMODE) | in lanai_dev_open()
2213 conf1_write(lanai); in lanai_dev_open()
2214 lanai->status = reg_read(lanai, Status_Reg); in lanai_dev_open()
2217 lanai->conf1 |= CONFIG1_POWERDOWN; in lanai_dev_open()
2218 conf1_write(lanai); in lanai_dev_open()
2220 memcpy(atmdev->esi, eeprom_mac(lanai), ESI_LEN); in lanai_dev_open()
2221 lanai_timed_poll_start(lanai); in lanai_dev_open()
2223 "(%pMF)\n", lanai->number, (int) lanai->pci->revision, in lanai_dev_open()
2224 (unsigned long) lanai->base, lanai->pci->irq, atmdev->esi); in lanai_dev_open()
2226 "board_rev=%d\n", lanai->number, in lanai_dev_open()
2227 lanai->type==lanai2 ? "2" : "HB", (unsigned int) lanai->serialno, in lanai_dev_open()
2228 (unsigned int) lanai->serialno, lanai->board_rev); in lanai_dev_open()
2232 vcc_table_deallocate(lanai); in lanai_dev_open()
2234 service_buffer_deallocate(lanai); in lanai_dev_open()
2236 reset_board(lanai); in lanai_dev_open()
2238 lanai->conf1 = reg_read(lanai, Config1_Reg) | CONFIG1_POWERDOWN; in lanai_dev_open()
2239 conf1_write(lanai); in lanai_dev_open()
2241 iounmap(lanai->base); in lanai_dev_open()
2243 pci_disable_device(lanai->pci); in lanai_dev_open()
2253 struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data; in lanai_dev_close() local
2255 lanai->number); in lanai_dev_close()
2256 lanai_timed_poll_stop(lanai); in lanai_dev_close()
2258 lanai->conf1 = reg_read(lanai, Config1_Reg) & ~CONFIG1_POWERDOWN; in lanai_dev_close()
2259 conf1_write(lanai); in lanai_dev_close()
2261 intr_disable(lanai, INT_ALL); in lanai_dev_close()
2262 free_irq(lanai->pci->irq, lanai); in lanai_dev_close()
2263 reset_board(lanai); in lanai_dev_close()
2265 lanai->conf1 |= CONFIG1_POWERDOWN; in lanai_dev_close()
2266 conf1_write(lanai); in lanai_dev_close()
2268 pci_disable_device(lanai->pci); in lanai_dev_close()
2269 vcc_table_deallocate(lanai); in lanai_dev_close()
2270 service_buffer_deallocate(lanai); in lanai_dev_close()
2271 iounmap(lanai->base); in lanai_dev_close()
2272 kfree(lanai); in lanai_dev_close()
2279 struct lanai_dev *lanai = (struct lanai_dev *) atmvcc->dev->dev_data; in lanai_close() local
2287 if (--lanai->naal0 <= 0) in lanai_close()
2288 aal0_buffer_free(lanai); in lanai_close()
2290 lanai_buf_deallocate(&lvcc->rx.buf, lanai->pci); in lanai_close()
2294 if (atmvcc == lanai->cbrvcc) { in lanai_close()
2296 lanai_cbr_shutdown(lanai); in lanai_close()
2297 lanai->cbrvcc = NULL; in lanai_close()
2299 lanai_shutdown_tx_vci(lanai, lvcc); in lanai_close()
2300 lanai_buf_deallocate(&lvcc->tx.buf, lanai->pci); in lanai_close()
2304 host_vcc_unbind(lanai, lvcc); in lanai_close()
2314 struct lanai_dev *lanai; in lanai_open() local
2323 lanai = (struct lanai_dev *) atmvcc->dev->dev_data; in lanai_open()
2324 result = lanai_normalize_ci(lanai, atmvcc, &vpi, &vci); in lanai_open()
2330 DPRINTK(DEV_LABEL "(itf %d): open %d.%d\n", lanai->number, in lanai_open()
2332 lvcc = lanai->vccs[vci]; in lanai_open()
2344 if (lanai->naal0 == 0) in lanai_open()
2345 result = aal0_buffer_allocate(lanai); in lanai_open()
2348 lanai, lvcc, &atmvcc->qos); in lanai_open()
2358 lanai->naal0++; in lanai_open()
2363 result = lanai_setup_tx_vci(lanai, lvcc, &atmvcc->qos); in lanai_open()
2368 APRINTK(lanai->cbrvcc == NULL, in lanai_open()
2370 lanai->cbrvcc = atmvcc; in lanai_open()
2373 host_vcc_bind(lanai, lvcc, vci); in lanai_open()
2383 if (lanai->cbrvcc == atmvcc) in lanai_open()
2384 lanai_cbr_setup(lanai); in lanai_open()
2397 struct lanai_dev *lanai = (struct lanai_dev *) atmvcc->dev->dev_data; in lanai_send() local
2407 if (unlikely(lanai == NULL)) { in lanai_send()
2416 vcc_tx_aal5(lanai, lvcc, skb); in lanai_send()
2425 vcc_tx_aal0(lanai, lvcc, skb); in lanai_send()
2447 struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data; in lanai_proc_read() local
2453 atmdev->number, lanai->type==lanai2 ? "2" : "HB", in lanai_proc_read()
2454 (unsigned int) lanai->serialno, in lanai_proc_read()
2455 (unsigned int) lanai->magicno, lanai->num_vci); in lanai_proc_read()
2458 lanai->board_rev, (int) lanai->pci->revision); in lanai_proc_read()
2461 &lanai->eeprom[EEPROM_MAC]); in lanai_proc_read()
2464 "GPIN=%d\n", (lanai->status & STATUS_SOOL) ? 1 : 0, in lanai_proc_read()
2465 (lanai->status & STATUS_LOCD) ? 1 : 0, in lanai_proc_read()
2466 (lanai->status & STATUS_LED) ? 1 : 0, in lanai_proc_read()
2467 (lanai->status & STATUS_GPIN) ? 1 : 0); in lanai_proc_read()
2470 "aal0_rx=%Zu\n", lanai_buf_size(&lanai->service), in lanai_proc_read()
2471 lanai->naal0 ? lanai_buf_size(&lanai->aal0buf) : 0); in lanai_proc_read()
2473 get_statistics(lanai); in lanai_proc_read()
2476 lanai->stats.ovfl_trash, lanai->stats.vci_trash, in lanai_proc_read()
2477 lanai->stats.hec_err, lanai->stats.atm_ovfl); in lanai_proc_read()
2482 lanai->stats.pcierr_parity_detect, in lanai_proc_read()
2483 lanai->stats.pcierr_serr_set, in lanai_proc_read()
2484 lanai->stats.pcierr_m_target_abort); in lanai_proc_read()
2487 "master_parity=%u\n", lanai->stats.pcierr_s_target_abort, in lanai_proc_read()
2488 lanai->stats.pcierr_master_parity); in lanai_proc_read()
2491 "no_rx=%u, bad_rx_aal=%u\n", lanai->stats.service_norx, in lanai_proc_read()
2492 lanai->stats.service_notx, in lanai_proc_read()
2493 lanai->stats.service_rxnotaal5); in lanai_proc_read()
2496 lanai->stats.dma_reenable, lanai->stats.card_reset); in lanai_proc_read()
2504 if ((lvcc = lanai->vccs[left]) != NULL) in lanai_proc_read()
2529 lvcc->tx.atmvcc == lanai->cbrvcc ? 'C' : 'U', in lanai_proc_read()
2559 struct lanai_dev *lanai; in lanai_init_one() local
2563 lanai = kmalloc(sizeof(*lanai), GFP_KERNEL); in lanai_init_one()
2564 if (lanai == NULL) { in lanai_init_one()
2574 kfree(lanai); in lanai_init_one()
2578 atmdev->dev_data = lanai; in lanai_init_one()
2579 lanai->pci = pci; in lanai_init_one()
2580 lanai->type = (enum lanai_type) ident->device; in lanai_init_one()
2586 kfree(lanai); in lanai_init_one()