[BACK]Return to if_san_xilinx.c CVS log [TXT][DIR] Up to [local] / sys / dev / pci

Annotation of sys/dev/pci/if_san_xilinx.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: if_san_xilinx.c,v 1.18 2006/04/20 20:31:12 miod Exp $ */
        !             2:
        !             3: /*-
        !             4:  * Copyright (c) 2001-2004 Sangoma Technologies (SAN)
        !             5:  * All rights reserved.  www.sangoma.com
        !             6:  *
        !             7:  * This code is written by Nenad Corbic <ncorbic@sangoma.com> and
        !             8:  * Alex Feldman <al.feldman@sangoma.com> for SAN.
        !             9:  *
        !            10:  * Redistribution and use in source and binary forms, with or without
        !            11:  * modification, are permitted provided that the following conditions
        !            12:  * are met:
        !            13:  * 1. Redistributions of source code must retain the above copyright
        !            14:  *    notice, this list of conditions and the following disclaimer.
        !            15:  * 2. Redistributions in binary form must reproduce the above
        !            16:  *    copyright notice, this list of conditions and the following disclaimer
        !            17:  *    in the documentation and/or other materials provided with the
        !            18:  *    distribution.
        !            19:  * 3. Neither the name of Sangoma Technologies nor the names of its
        !            20:  *    contributors may be used to endorse or promote products derived
        !            21:  *    from this software without specific prior written permission.
        !            22:  *
        !            23:  * THIS SOFTWARE IS PROVIDED BY SANGOMA TECHNOLOGIES AND CONTRIBUTORS
        !            24:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
        !            25:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
        !            26:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
        !            27:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        !            28:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        !            29:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        !            30:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        !            31:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        !            32:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
        !            33:  * THE POSSIBILITY OF SUCH DAMAGE.
        !            34:  */
        !            35:
        !            36: #include <sys/types.h>
        !            37: #include <sys/param.h>
        !            38: #include <sys/systm.h>
        !            39: #include <sys/syslog.h>
        !            40: #include <sys/ioccom.h>
        !            41: #include <sys/malloc.h>
        !            42: #include <sys/errno.h>
        !            43: #include <sys/mbuf.h>
        !            44: #include <sys/proc.h>
        !            45: #include <sys/socket.h>
        !            46: #include <sys/kernel.h>
        !            47: #include <sys/time.h>
        !            48: #include <sys/timeout.h>
        !            49:
        !            50: #include <net/bpf.h>
        !            51: #include <net/if.h>
        !            52: #include <net/if_media.h>
        !            53: #include <net/netisr.h>
        !            54: #include <net/if_sppp.h>
        !            55: #include <netinet/in_systm.h>
        !            56: #include <netinet/in.h>
        !            57: #include <netinet/in_var.h>
        !            58: #include <netinet/udp.h>
        !            59: #include <netinet/ip.h>
        !            60:
        !            61: #include <machine/bus.h>
        !            62:
        !            63: #include <dev/pci/if_san_common.h>
        !            64: #include <dev/pci/if_san_obsd.h>
        !            65: #include <dev/pci/if_san_xilinx.h>
        !            66:
        !            67:
        !            68: /* Private critical flags */
        !            69: enum {
        !            70:        POLL_CRIT = PRIV_CRIT,
        !            71:        TX_BUSY,
        !            72:        RX_BUSY,
        !            73:        TASK_POLL,
        !            74:        CARD_DOWN
        !            75: };
        !            76:
        !            77: enum {
        !            78:        LINK_DOWN,
        !            79:        DEVICE_DOWN
        !            80: };
        !            81:
        !            82: #define MAX_IP_ERRORS  10
        !            83:
        !            84: #define PORT(x)   (x == 0 ? "PRIMARY" : "SECONDARY" )
        !            85: #define MAX_TX_BUF     10
        !            86: #define MAX_RX_BUF     10
        !            87:
        !            88: #undef DEB_XILINX
        !            89:
        !            90: #if 1
        !            91: # define TRUE_FIFO_SIZE 1
        !            92: #else
        !            93: # undef  TRUE_FIFO_SIZE
        !            94: # define HARD_FIFO_CODE 0x01
        !            95: #endif
        !            96:
        !            97: static int aft_rx_copyback = MHLEN;
        !            98:
        !            99:
        !           100: struct xilinx_rx_buffer {
        !           101:        SIMPLEQ_ENTRY(xilinx_rx_buffer) entry;
        !           102:        struct mbuf *mbuf;
        !           103:        bus_dmamap_t dma_map;
        !           104:        wp_rx_element_t rx_el;
        !           105: };
        !           106:
        !           107: SIMPLEQ_HEAD(xilinx_rx_head, xilinx_rx_buffer);
        !           108:
        !           109: /*
        !           110:  * This structure is placed in the private data area of the device structure.
        !           111:  * The card structure used to occupy the private area but now the following
        !           112:  * structure will incorporate the card structure along with Protocol specific
        !           113:  * data
        !           114:  */
        !           115: typedef struct {
        !           116:        wanpipe_common_t        common;
        !           117:
        !           118:        struct ifqueue  wp_tx_pending_list;
        !           119:        struct ifqueue  wp_tx_complete_list;
        !           120:        struct xilinx_rx_head   wp_rx_free_list;
        !           121:        struct xilinx_rx_head   wp_rx_complete_list;
        !           122:        struct xilinx_rx_buffer *wp_rx_buffers;
        !           123:        struct xilinx_rx_buffer *wp_rx_buffer_last;
        !           124:        struct xilinx_rx_buffer *rx_dma_buf;
        !           125:
        !           126:        bus_dma_tag_t   dmatag;
        !           127:        bus_dmamap_t    tx_dmamap;
        !           128:        struct mbuf     *tx_dma_mbuf;
        !           129:        u_int8_t        tx_dma_cnt;
        !           130:
        !           131:        unsigned long   time_slot_map;
        !           132:        unsigned char   num_of_time_slots;
        !           133:        long            logic_ch_num;
        !           134:
        !           135:        unsigned char   dma_status;
        !           136:        unsigned char   ignore_modem;
        !           137:        struct ifqueue  udp_queue;
        !           138:
        !           139:        unsigned long   router_start_time;
        !           140:
        !           141:        unsigned long   tick_counter;           /* For 5s timeout counter */
        !           142:        unsigned long   router_up_time;
        !           143:
        !           144:        unsigned char   mc;                     /* Mulitcast support on/off */
        !           145:        unsigned char   udp_pkt_src;            /* udp packet processing */
        !           146:        unsigned short  timer_int_enabled;
        !           147:
        !           148:        unsigned char   interface_down;
        !           149:
        !           150:        u_int8_t        gateway;
        !           151:        u_int8_t        true_if_encoding;
        !           152:
        !           153:        char            if_name[IFNAMSIZ+1];
        !           154:
        !           155:        u_int8_t        idle_flag;
        !           156:        u_int16_t       max_idle_size;
        !           157:        u_int8_t        idle_start;
        !           158:
        !           159:        u_int8_t        pkt_error;
        !           160:        u_int8_t        rx_fifo_err_cnt;
        !           161:
        !           162:        int             first_time_slot;
        !           163:
        !           164:        unsigned long   tx_dma_addr;
        !           165:        unsigned int    tx_dma_len;
        !           166:        unsigned char   rx_dma;
        !           167:        unsigned char   pci_retry;
        !           168:
        !           169:        unsigned char   fifo_size_code;
        !           170:        unsigned char   fifo_base_addr;
        !           171:        unsigned char   fifo_size;
        !           172:
        !           173:        int             dma_mtu;
        !           174:
        !           175:        void            *prot_ch;
        !           176:        wan_trace_t     trace_info;
        !           177: }xilinx_softc_t;
        !           178: #define WAN_IFP_TO_SOFTC(ifp)  (xilinx_softc_t *)((ifp)->if_softc)
        !           179:
        !           180: /* Route Status options */
        !           181: #define NO_ROUTE       0x00
        !           182: #define ADD_ROUTE      0x01
        !           183: #define ROUTE_ADDED    0x02
        !           184: #define REMOVE_ROUTE   0x03
        !           185:
        !           186: #define WP_WAIT                0
        !           187: #define WP_NO_WAIT     1
        !           188:
        !           189: /* variable for keeping track of enabling/disabling FT1 monitor status */
        !           190: /* static int rCount; */
        !           191:
        !           192: extern void disable_irq(unsigned int);
        !           193: extern void enable_irq(unsigned int);
        !           194:
        !           195: /**SECTOIN**************************************************
        !           196:  *
        !           197:  * Function Prototypes
        !           198:  *
        !           199:  ***********************************************************/
        !           200:
        !           201: /* WAN link driver entry points. These are called by the WAN router module. */
        !           202: static int     wan_xilinx_release(sdla_t*, struct ifnet *);
        !           203:
        !           204: /* Network device interface */
        !           205: static int     wan_xilinx_up(struct ifnet *);
        !           206: static int     wan_xilinx_down(struct ifnet *);
        !           207: static int     wan_xilinx_ioctl(struct ifnet *, int cmd, struct ifreq *);
        !           208: static int     wan_xilinx_send(struct mbuf *, struct ifnet *);
        !           209:
        !           210: static void    handle_front_end_state(void *);
        !           211: static void    enable_timer(void *);
        !           212:
        !           213: /* Miscellaneous Functions */
        !           214: static void    port_set_state (sdla_t *, int);
        !           215:
        !           216: /* Interrupt handlers */
        !           217: static void    wp_xilinx_isr (sdla_t *);
        !           218:
        !           219: /* Miscellaneous functions */
        !           220: static int     process_udp_mgmt_pkt(sdla_t *, struct ifnet *,
        !           221:                    xilinx_softc_t *, int);
        !           222: /* Bottom half handlers */
        !           223: static void    xilinx_process_packet(xilinx_softc_t *);
        !           224:
        !           225: static int     xilinx_chip_configure(sdla_t *);
        !           226: static int     xilinx_chip_unconfigure(sdla_t *);
        !           227: static int     xilinx_dev_configure(sdla_t *, xilinx_softc_t *);
        !           228: static void    xilinx_dev_unconfigure(sdla_t *, xilinx_softc_t *);
        !           229: static int     xilinx_dma_rx(sdla_t *, xilinx_softc_t *);
        !           230: static void    xilinx_dev_enable(sdla_t *, xilinx_softc_t *);
        !           231: static void    xilinx_dev_close(sdla_t *, xilinx_softc_t *);
        !           232: static int     xilinx_dma_tx (sdla_t *, xilinx_softc_t *);
        !           233: static void    xilinx_dma_tx_complete (sdla_t *, xilinx_softc_t *);
        !           234: static void    xilinx_dma_rx_complete (sdla_t *, xilinx_softc_t *);
        !           235: static void    xilinx_dma_max_logic_ch(sdla_t *);
        !           236: static int     xilinx_init_rx_dev_fifo(sdla_t *, xilinx_softc_t *,
        !           237:                    unsigned char);
        !           238: static void    xilinx_init_tx_dma_descr(sdla_t *, xilinx_softc_t *);
        !           239: static int     xilinx_init_tx_dev_fifo(sdla_t *, xilinx_softc_t *,
        !           240:                    unsigned char);
        !           241: static void    xilinx_tx_post_complete(sdla_t *, xilinx_softc_t *,
        !           242:                    struct mbuf *);
        !           243: static void    xilinx_rx_post_complete(sdla_t *, xilinx_softc_t *,
        !           244:                    struct xilinx_rx_buffer *, struct mbuf **, u_char *);
        !           245:
        !           246:
        !           247: static char    request_xilinx_logical_channel_num(sdla_t *, xilinx_softc_t *,
        !           248:                    long *);
        !           249: static void    free_xilinx_logical_channel_num (sdla_t *, int);
        !           250:
        !           251:
        !           252: static unsigned char read_cpld(sdla_t *, unsigned short);
        !           253: static unsigned char write_cpld(sdla_t *, unsigned short, unsigned char);
        !           254:
        !           255: static void    front_end_interrupt(sdla_t *, unsigned long);
        !           256: static void    enable_data_error_intr(sdla_t *);
        !           257: static void    disable_data_error_intr(sdla_t *, unsigned char);
        !           258:
        !           259: static void    xilinx_tx_fifo_under_recover(sdla_t *, xilinx_softc_t *);
        !           260:
        !           261: static int     xilinx_write_ctrl_hdlc(sdla_t *, u_int32_t,
        !           262:                    u_int8_t, u_int32_t);
        !           263:
        !           264: static int     set_chan_state(sdla_t*, struct ifnet*, int);
        !           265:
        !           266: static int     fifo_error_interrupt(sdla_t *, unsigned long);
        !           267: static int     request_fifo_baddr_and_size(sdla_t *, xilinx_softc_t *);
        !           268: static int     map_fifo_baddr_and_size(sdla_t *,
        !           269:                    unsigned char, unsigned char *);
        !           270: static int     free_fifo_baddr_and_size(sdla_t *, xilinx_softc_t *);
        !           271:
        !           272: static void    aft_red_led_ctrl(sdla_t *, int);
        !           273: static void    aft_led_timer(void *);
        !           274:
        !           275: static int     aft_core_ready(sdla_t *);
        !           276: static int     aft_alloc_rx_buffers(xilinx_softc_t *);
        !           277: static void    aft_release_rx_buffers(xilinx_softc_t *);
        !           278: static int     aft_alloc_rx_dma_buff(xilinx_softc_t *, int);
        !           279: static void    aft_reload_rx_dma_buff(xilinx_softc_t *,
        !           280:                    struct xilinx_rx_buffer *);
        !           281: static void    aft_release_rx_dma_buff(xilinx_softc_t *,
        !           282:                    struct xilinx_rx_buffer *);
        !           283:
        !           284:
        !           285: /* TE1 Control registers  */
        !           286: static WRITE_FRONT_END_REG_T write_front_end_reg;
        !           287: static READ_FRONT_END_REG_T  read_front_end_reg;
        !           288:
        !           289: static void    wan_ifmedia_sts(struct ifnet *, struct ifmediareq *);
        !           290: static int     wan_ifmedia_upd(struct ifnet *);
        !           291:
        !           292: static void
        !           293: xilinx_delay(int sec)
        !           294: {
        !           295: #if 0
        !           296:        unsigned long timeout = ticks;
        !           297:        while ((ticks - timeout) < (sec * hz)) {
        !           298:                schedule();
        !           299:        }
        !           300: #endif
        !           301: }
        !           302:
        !           303: void *
        !           304: wan_xilinx_init(sdla_t *card)
        !           305: {
        !           306:        xilinx_softc_t  *sc;
        !           307:        struct ifnet    *ifp;
        !           308:
        !           309:        /* Verify configuration ID */
        !           310:        bit_clear((u_int8_t *)&card->critical, CARD_DOWN);
        !           311:
        !           312:        card->u.xilinx.num_of_ch = 0;
        !           313:        card->u.xilinx.mru_trans = 1500;
        !           314:        card->u.xilinx.dma_per_ch = 10;
        !           315:
        !           316:        /* TE1 Make special hardware initialization for T1/E1 board */
        !           317:
        !           318:        if (IS_TE1(&card->fe_te.te_cfg)) {
        !           319:                card->write_front_end_reg = write_front_end_reg;
        !           320:                card->read_front_end_reg = read_front_end_reg;
        !           321:                card->te_enable_timer = enable_timer;
        !           322:                card->te_link_state = handle_front_end_state;
        !           323:        } else
        !           324:                card->front_end_status = FE_CONNECTED;
        !           325:
        !           326:        /* WARNING: After this point the init function
        !           327:         * must return with 0.  The following bind
        !           328:         * functions will cause problems if structures
        !           329:         * below are not initialized */
        !           330:
        !           331:        card->del_if     = &wan_xilinx_release;
        !           332:        card->iface_up   = &wan_xilinx_up;
        !           333:        card->iface_down = &wan_xilinx_down;
        !           334:        card->iface_send = &wan_xilinx_send;
        !           335:        card->iface_ioctl= &wan_xilinx_ioctl;
        !           336:
        !           337:        write_cpld(card, LED_CONTROL_REG, 0x0E);
        !           338:
        !           339:        sdla_getcfg(card->hw, SDLA_BASEADDR, &card->u.xilinx.bar);
        !           340:
        !           341:        xilinx_delay(1);
        !           342:
        !           343:        timeout_set(&card->u.xilinx.led_timer, aft_led_timer, (void *)card);
        !           344:
        !           345:        /* allocate and initialize private data */
        !           346:        sc = malloc(sizeof(xilinx_softc_t), M_DEVBUF, M_NOWAIT);
        !           347:        if (sc == NULL)
        !           348:                return (NULL);
        !           349:
        !           350:        memset(sc, 0, sizeof(xilinx_softc_t));
        !           351:        ifp = (struct ifnet *)&sc->common.ifp;
        !           352:        ifp->if_softc = sc;
        !           353:        sc->common.card = card;
        !           354:        if (wanpipe_generic_register(card, ifp, card->devname)) {
        !           355:                free(sc, M_DEVBUF);
        !           356:                return (NULL);
        !           357:        }
        !           358:
        !           359:        strlcpy(sc->if_name, ifp->if_xname, IFNAMSIZ);
        !           360:        sc->first_time_slot = -1;
        !           361:        sc->time_slot_map = 0;
        !           362:        sdla_getcfg(card->hw, SDLA_DMATAG, &sc->dmatag);
        !           363:
        !           364:        IFQ_SET_MAXLEN(&sc->wp_tx_pending_list, MAX_TX_BUF);
        !           365:        sc->wp_tx_pending_list.ifq_len = 0;
        !           366:        IFQ_SET_MAXLEN(&sc->wp_tx_complete_list, MAX_TX_BUF);
        !           367:        sc->wp_tx_complete_list.ifq_len = 0;
        !           368:
        !           369:        aft_alloc_rx_buffers(sc);
        !           370:
        !           371:        xilinx_delay(1);
        !           372:
        !           373:        ifmedia_init(&sc->common.ifm, 0, wan_ifmedia_upd, wan_ifmedia_sts);
        !           374:
        !           375:        if (IS_TE1(&card->fe_te.te_cfg)) {
        !           376:                ifmedia_add(&sc->common.ifm, IFM_TDM|IFM_TDM_T1, 0, NULL);
        !           377:                ifmedia_add(&sc->common.ifm, IFM_TDM|IFM_TDM_T1_AMI, 0, NULL);
        !           378:                ifmedia_add(&sc->common.ifm, IFM_TDM|IFM_TDM_E1, 0, NULL);
        !           379:                ifmedia_add(&sc->common.ifm, IFM_TDM|IFM_TDM_E1_AMI, 0, NULL);
        !           380:
        !           381:                ifmedia_add(&sc->common.ifm,
        !           382:                    IFM_TDM|IFM_TDM_T1|IFM_TDM_PPP, 0, NULL);
        !           383:                ifmedia_add(&sc->common.ifm,
        !           384:                    IFM_TDM|IFM_TDM_T1_AMI|IFM_TDM_PPP, 0, NULL);
        !           385:                ifmedia_add(&sc->common.ifm,
        !           386:                    IFM_TDM|IFM_TDM_E1|IFM_TDM_PPP, 0, NULL);
        !           387:                ifmedia_add(&sc->common.ifm,
        !           388:                    IFM_TDM|IFM_TDM_E1_AMI|IFM_TDM_PPP, 0, NULL);
        !           389:
        !           390:                ifmedia_set(&sc->common.ifm, IFM_TDM|IFM_TDM_T1);
        !           391:        } else {
        !           392:                /* Currently we not support ifmedia types for other
        !           393:                 * front end types.
        !           394:                 */
        !           395:        }
        !           396:
        !           397:        return (sc);
        !           398: }
        !           399:
        !           400: static int
        !           401: wan_xilinx_release(sdla_t* card, struct ifnet* ifp)
        !           402: {
        !           403:        xilinx_softc_t *sc = ifp->if_softc;
        !           404:
        !           405:        IF_PURGE(&sc->wp_tx_pending_list);
        !           406:
        !           407:        if (sc->tx_dma_addr && sc->tx_dma_len) {
        !           408:                sc->tx_dma_addr = 0;
        !           409:                sc->tx_dma_len = 0;
        !           410:        }
        !           411:
        !           412:        if (sc->tx_dma_mbuf) {
        !           413:                log(LOG_INFO, "freeing tx dma mbuf\n");
        !           414:                bus_dmamap_unload(sc->dmatag, sc->tx_dmamap);
        !           415:                m_freem(sc->tx_dma_mbuf);
        !           416:                sc->tx_dma_mbuf = NULL;
        !           417:        }
        !           418:
        !           419: #if 0
        !           420:        bus_dmamap_destroy(sc->dmatag, sc->tx_dmamap);
        !           421: #endif
        !           422:        if (sc->rx_dma_buf) {
        !           423:                SIMPLEQ_INSERT_TAIL(&sc->wp_rx_free_list,
        !           424:                    sc->rx_dma_buf, entry);
        !           425:                sc->rx_dma_buf = NULL;
        !           426:        }
        !           427:
        !           428:        aft_release_rx_buffers(sc);
        !           429:
        !           430:        wanpipe_generic_unregister(ifp);
        !           431:        ifp->if_softc = NULL;
        !           432:        free(sc, M_DEVBUF);
        !           433:
        !           434:        return (0);
        !           435: }
        !           436:
        !           437: static void
        !           438: wan_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmreq)
        !           439: {
        !           440:        wanpipe_common_t        *common = (wanpipe_common_t *)ifp->if_softc;
        !           441:        struct ifmedia          *ifm;
        !           442:
        !           443:        WAN_ASSERT1(common == NULL);
        !           444:        ifm = &common->ifm;
        !           445:        ifmreq->ifm_active = ifm->ifm_cur->ifm_media;
        !           446: }
        !           447:
        !           448: static int
        !           449: wan_ifmedia_upd(struct ifnet *ifp)
        !           450: {
        !           451:        wanpipe_common_t        *common = (wanpipe_common_t *)ifp->if_softc;
        !           452:        sdla_t                  *card;
        !           453:
        !           454:        WAN_ASSERT(common == NULL);
        !           455:        WAN_ASSERT(common->card == NULL);
        !           456:        card = (sdla_t *)common->card;
        !           457:
        !           458:        if (IS_TE1(&card->fe_te.te_cfg))
        !           459:                return (sdla_te_setcfg(ifp, &common->ifm));
        !           460:
        !           461:        return (EINVAL);
        !           462: }
        !           463:
        !           464:
        !           465: /*
        !           466:  * KERNEL Device Entry Interfaces
        !           467:  */
        !           468:
        !           469: static int
        !           470: wan_xilinx_up(struct ifnet *ifp)
        !           471: {
        !           472:        xilinx_softc_t  *sc = ifp->if_softc;
        !           473:        sdla_t          *card = NULL;
        !           474:        struct timeval   tv;
        !           475:        int              err = 0;
        !           476:
        !           477:        WAN_ASSERT(sc == NULL);
        !           478:        WAN_ASSERT(sc->common.card == NULL);
        !           479:        card = (sdla_t *)sc->common.card;
        !           480:
        !           481:        if (card->state != WAN_DISCONNECTED)
        !           482:                return (0);
        !           483:
        !           484:        sc->time_slot_map = card->fe_te.te_cfg.active_ch;
        !           485:        sc->dma_mtu = xilinx_valid_mtu(ifp->if_mtu+100);
        !           486:
        !           487:        if (!sc->dma_mtu) {
        !           488:                log(LOG_INFO, "%s:%s: Error invalid MTU %lu\n",
        !           489:                    card->devname, sc->if_name, ifp->if_mtu);
        !           490:                return (EINVAL);
        !           491:        }
        !           492:
        !           493: #ifdef DEBUG_INIT
        !           494:        log(LOG_INFO, "%s: Allocating %d dma mbuf len=%d\n",
        !           495:            card->devname, card->u.xilinx.dma_per_ch, sc->dma_mtu);
        !           496: #endif
        !           497:        if (aft_alloc_rx_dma_buff(sc, card->u.xilinx.dma_per_ch) == 0)
        !           498:                return (ENOMEM);
        !           499:
        !           500:        if (bus_dmamap_create(sc->dmatag, sc->dma_mtu, 1, sc->dma_mtu,
        !           501:              0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &sc->tx_dmamap)) {
        !           502:                log(LOG_INFO, "%s: Failed to allocate tx dmamap\n",
        !           503:                    sc->if_name);
        !           504:                return (ENOMEM);
        !           505:        }
        !           506:
        !           507:        err = xilinx_chip_configure(card);
        !           508:        if (err)
        !           509:                return (EINVAL);
        !           510:
        !           511:        card->isr = &wp_xilinx_isr;
        !           512:
        !           513:        err = xilinx_dev_configure(card, sc);
        !           514:        if (err) {
        !           515:                xilinx_chip_unconfigure(card);
        !           516:                return (EINVAL);
        !           517:        }
        !           518:        xilinx_delay(1);
        !           519:
        !           520:        /* Initialize the router start time.
        !           521:         * Used by wanpipemon debugger to indicate
        !           522:         * how long has the interface been up */
        !           523:        microtime(&tv);
        !           524:        sc->router_start_time = tv.tv_sec;
        !           525:
        !           526:        xilinx_init_tx_dma_descr(card, sc);
        !           527:        xilinx_dev_enable(card, sc);
        !           528:
        !           529:        sc->ignore_modem = 0x0F;
        !           530:        bit_clear((u_int8_t *)&card->critical, CARD_DOWN);
        !           531:        port_set_state(card, WAN_CONNECTING);
        !           532:
        !           533:        return (err);
        !           534: }
        !           535:
        !           536: static int
        !           537: wan_xilinx_down(struct ifnet *ifp)
        !           538: {
        !           539:        xilinx_softc_t  *sc = ifp->if_softc;
        !           540:        sdla_t          *card = (sdla_t *)sc->common.card;
        !           541:        struct xilinx_rx_buffer *buf;
        !           542:        int             s;
        !           543:
        !           544:        if (card->state == WAN_DISCONNECTED)
        !           545:                return (0);
        !           546:
        !           547:        xilinx_dev_close(card, sc);
        !           548:
        !           549:        /* Disable DMA ENGINE before we perform
        !           550:         * core reset.  Otherwise, we will receive
        !           551:         * rx fifo errors on subsequent resetart. */
        !           552:        disable_data_error_intr(card, DEVICE_DOWN);
        !           553:
        !           554:        bit_set((u_int8_t *)&card->critical, CARD_DOWN);
        !           555:
        !           556:        timeout_del(&card->u.xilinx.led_timer);
        !           557:
        !           558:        /* TE1 - Unconfiging, only on shutdown */
        !           559:        if (IS_TE1(&card->fe_te.te_cfg))
        !           560:                sdla_te_unconfig(card);
        !           561:
        !           562:        s = splnet();
        !           563:
        !           564:        card->isr = NULL;
        !           565:
        !           566:        if (sc->tx_dma_addr && sc->tx_dma_len) {
        !           567:                sc->tx_dma_addr = 0;
        !           568:                sc->tx_dma_len = 0;
        !           569:        }
        !           570:
        !           571:        if (sc->tx_dma_mbuf) {
        !           572:                bus_dmamap_unload(sc->dmatag, sc->tx_dmamap);
        !           573:                m_freem(sc->tx_dma_mbuf);
        !           574:                sc->tx_dma_mbuf = NULL;
        !           575:        }
        !           576:
        !           577:        bus_dmamap_destroy(sc->dmatag, sc->tx_dmamap);
        !           578:
        !           579:        /* If there is something left in rx_dma_buf, then move it to
        !           580:         * rx_free_list.
        !           581:         */
        !           582:        if (sc->rx_dma_buf) {
        !           583:                aft_reload_rx_dma_buff(sc, sc->rx_dma_buf);
        !           584:                sc->rx_dma_buf = NULL;
        !           585:        }
        !           586:
        !           587:        while ((buf = SIMPLEQ_FIRST(&sc->wp_rx_free_list)) != NULL) {
        !           588:                SIMPLEQ_REMOVE_HEAD(&sc->wp_rx_free_list, entry);
        !           589:                aft_release_rx_dma_buff(sc, buf);
        !           590:        }
        !           591:
        !           592:        while ((buf = SIMPLEQ_FIRST(&sc->wp_rx_complete_list)) != NULL) {
        !           593:                SIMPLEQ_REMOVE_HEAD(&sc->wp_rx_complete_list, entry);
        !           594:                aft_release_rx_dma_buff(sc, buf);
        !           595:        }
        !           596:
        !           597:        splx(s);
        !           598:
        !           599:        DELAY(10);
        !           600:
        !           601:        xilinx_dev_unconfigure(card, sc);
        !           602:        xilinx_chip_unconfigure(card);
        !           603:
        !           604:        port_set_state(card, WAN_DISCONNECTED);
        !           605:        sc->ignore_modem = 0x00;
        !           606:        return (0);
        !           607: }
        !           608:
        !           609: static int
        !           610: wan_xilinx_send(struct mbuf* m, struct ifnet* ifp)
        !           611: {
        !           612:
        !           613:        xilinx_softc_t *sc = ifp->if_softc;
        !           614:        sdla_t *card = (sdla_t *)sc->common.card;
        !           615:
        !           616:        /* Mark interface as busy. The kernel will not
        !           617:         * attempt to send any more packets until we clear
        !           618:         * this condition */
        !           619:
        !           620:        if (m == NULL)
        !           621:                /* This should never happen. Just a sanity check.
        !           622:                 */
        !           623:                return (EINVAL);
        !           624:
        !           625:        if (card->state != WAN_CONNECTED) {
        !           626:                /*
        !           627:                 * The card is still not ready to transmit...
        !           628:                 * drop this packet!
        !           629:                 */
        !           630:                m_freem(m);
        !           631:                return (EINVAL);
        !           632:
        !           633:        } else {
        !           634:                if (IF_QFULL(&sc->wp_tx_pending_list)) {
        !           635:                        int err;
        !           636: #ifdef DEBUG_TX
        !           637:                        log(LOG_INFO, "%s: Tx pending queue FULL\n",
        !           638:                                ifp->if_xname);
        !           639: #endif
        !           640:                        /*
        !           641:                         * TX pending queue is full. Try to send packet
        !           642:                         * from tx_pending queue (first)
        !           643:                         */
        !           644:                        err = xilinx_dma_tx(card, sc);
        !           645:                        if (!err && !IF_QFULL(&sc->wp_tx_pending_list))
        !           646:                                /*
        !           647:                                 * On success, we have place for the new
        !           648:                                 * tx packet, try to send it now!
        !           649:                                 */
        !           650:                                goto wan_xilinx_dma_tx_try;
        !           651:
        !           652:                        /*
        !           653:                         * Tx pedning queue is full. I can't accept new
        !           654:                         * tx packet, drop this packet and set interface
        !           655:                         * queue to OACTIVE
        !           656:                         */
        !           657:                        m_freem(m);
        !           658:                        ifp->if_flags |= IFF_OACTIVE;
        !           659:
        !           660:                        return (EBUSY);
        !           661:                } else {
        !           662: wan_xilinx_dma_tx_try:
        !           663:                        IF_ENQUEUE(&sc->wp_tx_pending_list, m);
        !           664:                        xilinx_dma_tx(card, sc);
        !           665:                }
        !           666:        }
        !           667:
        !           668:        return (0);
        !           669: }
        !           670:
        !           671: static int
        !           672: wan_xilinx_ioctl(struct ifnet *ifp, int cmd, struct ifreq *ifr)
        !           673: {
        !           674:        xilinx_softc_t  *sc = (xilinx_softc_t *)ifp->if_softc;
        !           675:        struct mbuf     *m;
        !           676:        sdla_t          *card;
        !           677:        wan_udp_pkt_t   *wan_udp_pkt;
        !           678:        int err = 0;
        !           679:
        !           680:        if (!sc)
        !           681:                return (ENODEV);
        !           682:
        !           683:        card = (sdla_t *)sc->common.card;
        !           684:
        !           685:        switch (cmd) {
        !           686:        case SIOC_WANPIPE_PIPEMON:
        !           687:
        !           688:                if ((err = suser(curproc, 0)) != 0)
        !           689:                        break;
        !           690:
        !           691:                if (IF_QFULL(&sc->udp_queue))
        !           692:                        return (EBUSY);
        !           693:
        !           694:                /*
        !           695:                 * For performance reasons test the critical
        !           696:                 * here before spin lock
        !           697:                 */
        !           698:                if (bit_test((u_int8_t *)&card->in_isr, 0))
        !           699:                        return (EBUSY);
        !           700:
        !           701:                m = wan_mbuf_alloc(sizeof(wan_udp_pkt_t));
        !           702:                if (m == NULL)
        !           703:                        return (ENOMEM);
        !           704:
        !           705:                wan_udp_pkt = mtod(m, wan_udp_pkt_t *);
        !           706:                if (copyin(ifr->ifr_data, &wan_udp_pkt->wan_udp_hdr,
        !           707:                    sizeof(wan_udp_hdr_t))) {
        !           708:                        m_freem(m);
        !           709:                        return (EFAULT);
        !           710:                }
        !           711:                IF_ENQUEUE(&sc->udp_queue, m);
        !           712:
        !           713:                process_udp_mgmt_pkt(card, ifp, sc, 1);
        !           714:
        !           715:                if (copyout(&wan_udp_pkt->wan_udp_hdr, ifr->ifr_data,
        !           716:                    sizeof(wan_udp_hdr_t))) {
        !           717:                        m_freem(m);
        !           718:                        return (EFAULT);
        !           719:                }
        !           720:
        !           721:                IF_DEQUEUE(&sc->udp_queue, m);
        !           722:                m_freem(m);
        !           723:                return (0);
        !           724:
        !           725:        default:
        !           726:                if (card->ioctl)
        !           727:                        err = card->ioctl(ifp, cmd, ifr);
        !           728:                break;
        !           729:        }
        !           730:
        !           731:        return (err);
        !           732: }
        !           733:
        !           734: /*
        !           735:  * Process all "wanpipemon" debugger commands.  This function
        !           736:  * performs all debugging tasks:
        !           737:  *
        !           738:  *     Line Tracing
        !           739:  *     Line/Hardware Statistics
        !           740:  *     Protocol Statistics
        !           741:  *
        !           742:  * "wanpipemon" utility is a user-space program that
        !           743:  * is used to debug the WANPIPE product.
        !           744:  */
        !           745: static int
        !           746: process_udp_mgmt_pkt(sdla_t* card, struct ifnet* ifp,
        !           747:     xilinx_softc_t* sc, int local_dev )
        !           748: {
        !           749:        struct mbuf     *m;
        !           750:        unsigned short   buffer_length;
        !           751:        wan_udp_pkt_t   *wan_udp_pkt;
        !           752:        wan_trace_t     *trace_info = NULL;
        !           753:        struct timeval   tv;
        !           754:
        !           755:        IF_POLL(&sc->udp_queue, m);
        !           756:        if (m == NULL)
        !           757:                return (EINVAL);
        !           758:
        !           759:        wan_udp_pkt = mtod(m, wan_udp_pkt_t *);
        !           760:        trace_info=&sc->trace_info;
        !           761:
        !           762:        {
        !           763:                struct mbuf *m0;
        !           764:
        !           765:                wan_udp_pkt->wan_udp_opp_flag = 0;
        !           766:
        !           767:                switch (wan_udp_pkt->wan_udp_command) {
        !           768:
        !           769:                case READ_CONFIGURATION:
        !           770:                case READ_CODE_VERSION:
        !           771:                        wan_udp_pkt->wan_udp_return_code = 0;
        !           772:                        wan_udp_pkt->wan_udp_data_len = 0;
        !           773:                        break;
        !           774:
        !           775:
        !           776:                case ENABLE_TRACING:
        !           777:
        !           778:                        wan_udp_pkt->wan_udp_return_code = WAN_CMD_OK;
        !           779:                        wan_udp_pkt->wan_udp_data_len = 0;
        !           780:
        !           781:                        if (!bit_test((u_int8_t *)
        !           782:                            &trace_info->tracing_enabled, 0)) {
        !           783:
        !           784:                                trace_info->trace_timeout = ticks;
        !           785:
        !           786:                                IF_PURGE(&trace_info->ifq);
        !           787:                                if (wan_udp_pkt->wan_udp_data[0] == 0) {
        !           788:                                        bit_clear((u_int8_t *)
        !           789:                                            &trace_info->tracing_enabled, 1);
        !           790:                                        log(LOG_INFO, "%s: ADSL L3 "
        !           791:                                            "trace enabled!\n", card->devname);
        !           792:                                } else if (wan_udp_pkt->wan_udp_data[0] == 1) {
        !           793:                                        bit_clear((u_int8_t *)
        !           794:                                            &trace_info->tracing_enabled, 2 );
        !           795:                                        bit_set((u_int8_t *)
        !           796:                                            &trace_info->tracing_enabled, 1);
        !           797:                                        log(LOG_INFO, "%s: ADSL L2 "
        !           798:                                            "trace enabled!\n", card->devname);
        !           799:                                } else {
        !           800:                                        bit_clear((u_int8_t *)
        !           801:                                            &trace_info->tracing_enabled, 1);
        !           802:                                        bit_set((u_int8_t *)
        !           803:                                            &trace_info->tracing_enabled, 2);
        !           804:                                        log(LOG_INFO, "%s: ADSL L1 "
        !           805:                                            "trace enabled!\n", card->devname);
        !           806:                                }
        !           807:                                bit_set((u_int8_t *)&
        !           808:                                    trace_info->tracing_enabled, 0);
        !           809:
        !           810:                        } else {
        !           811:                                log(LOG_INFO, "%s: Error: AFT "
        !           812:                                    "trace running!\n", card->devname);
        !           813:                                wan_udp_pkt->wan_udp_return_code = 2;
        !           814:                        }
        !           815:
        !           816:                        break;
        !           817:
        !           818:                case DISABLE_TRACING:
        !           819:                        wan_udp_pkt->wan_udp_return_code = WAN_CMD_OK;
        !           820:
        !           821:                        if (bit_test((u_int8_t *)
        !           822:                            &trace_info->tracing_enabled, 0)) {
        !           823:                                bit_clear((u_int8_t *)
        !           824:                                    &trace_info->tracing_enabled, 0);
        !           825:                                bit_clear((u_int8_t *)
        !           826:                                    &trace_info->tracing_enabled, 1);
        !           827:                                bit_clear((u_int8_t *)
        !           828:                                    &trace_info->tracing_enabled, 2);
        !           829:                                IF_PURGE(&trace_info->ifq);
        !           830:                                log(LOG_INFO, "%s: Disabling ADSL trace\n",
        !           831:                                    card->devname);
        !           832:                        } else {
        !           833:                                /*
        !           834:                                 * set return code to line trace already
        !           835:                                 * disabled
        !           836:                                 */
        !           837:                                wan_udp_pkt->wan_udp_return_code = 1;
        !           838:                        }
        !           839:
        !           840:                        break;
        !           841:
        !           842:                case GET_TRACE_INFO:
        !           843:                        if (bit_test((u_int8_t *)
        !           844:                            &trace_info->tracing_enabled, 0)) {
        !           845:                                trace_info->trace_timeout = ticks;
        !           846:                        } else {
        !           847:                                log(LOG_INFO, "%s: Error AFT trace "
        !           848:                                    "not enabled\n", card->devname);
        !           849:                                /* set return code */
        !           850:                                wan_udp_pkt->wan_udp_return_code = 1;
        !           851:                                break;
        !           852:                        }
        !           853:
        !           854:                        buffer_length = 0;
        !           855:                        wan_udp_pkt->wan_udp_aft_num_frames = 0;
        !           856:                        wan_udp_pkt->wan_udp_aft_ismoredata = 0;
        !           857:
        !           858:                        while (!IF_IS_EMPTY(&trace_info->ifq)) {
        !           859:                                IF_POLL(&trace_info->ifq, m0);
        !           860:                                if (m0 == NULL) {
        !           861:                                        log(LOG_INFO, "%s: No more "
        !           862:                                            "trace packets in trace queue!\n",
        !           863:                                            card->devname);
        !           864:                                        break;
        !           865:                                }
        !           866:                                if ((WAN_MAX_DATA_SIZE - buffer_length) <
        !           867:                                    m0->m_pkthdr.len) {
        !           868:                                        /*
        !           869:                                         * indicate there are more frames
        !           870:                                         * on board & exit
        !           871:                                         */
        !           872:                                        wan_udp_pkt->wan_udp_aft_ismoredata
        !           873:                                                                = 0x01;
        !           874:                                        break;
        !           875:                                }
        !           876:
        !           877:                                m_copydata(m0, 0, m0->m_pkthdr.len,
        !           878:                                    &wan_udp_pkt->wan_udp_data[buffer_length]);
        !           879:                                buffer_length += m0->m_pkthdr.len;
        !           880:                                IF_DEQUEUE(&trace_info->ifq, m0);
        !           881:                                if (m0)
        !           882:                                        m_freem(m0);
        !           883:                                wan_udp_pkt->wan_udp_aft_num_frames++;
        !           884:                        }
        !           885:                        /* set the data length and return code */
        !           886:                        wan_udp_pkt->wan_udp_data_len = buffer_length;
        !           887:                        wan_udp_pkt->wan_udp_return_code = WAN_CMD_OK;
        !           888:                        break;
        !           889:
        !           890:                case ROUTER_UP_TIME:
        !           891:                        microtime(&tv);
        !           892:                        sc->router_up_time = tv.tv_sec;
        !           893:                        sc->router_up_time -= sc->router_start_time;
        !           894:                        *(unsigned long *)&wan_udp_pkt->wan_udp_data =
        !           895:                                        sc->router_up_time;
        !           896:                        wan_udp_pkt->wan_udp_data_len = sizeof(unsigned long);
        !           897:                        wan_udp_pkt->wan_udp_return_code = 0;
        !           898:                        break;
        !           899:
        !           900:                case WAN_GET_MEDIA_TYPE:
        !           901:                case WAN_FE_GET_STAT:
        !           902:                case WAN_FE_SET_LB_MODE:
        !           903:                case WAN_FE_FLUSH_PMON:
        !           904:                case WAN_FE_GET_CFG:
        !           905:
        !           906:                        if (IS_TE1(&card->fe_te.te_cfg)) {
        !           907:                                sdla_te_udp(card,
        !           908:                                    &wan_udp_pkt->wan_udp_cmd,
        !           909:                                    &wan_udp_pkt->wan_udp_data[0]);
        !           910:                        } else {
        !           911:                                if (wan_udp_pkt->wan_udp_command ==
        !           912:                                    WAN_GET_MEDIA_TYPE) {
        !           913:                                        wan_udp_pkt->wan_udp_data_len =
        !           914:                                            sizeof(unsigned char);
        !           915:                                        wan_udp_pkt->wan_udp_return_code =
        !           916:                                            WAN_CMD_OK;
        !           917:                                } else {
        !           918:                                        wan_udp_pkt->wan_udp_return_code =
        !           919:                                            WAN_UDP_INVALID_CMD;
        !           920:                                }
        !           921:                        }
        !           922:                        break;
        !           923:
        !           924:                case WAN_GET_PROTOCOL:
        !           925:                        wan_udp_pkt->wan_udp_aft_num_frames = WANCONFIG_AFT;
        !           926:                        wan_udp_pkt->wan_udp_return_code = WAN_CMD_OK;
        !           927:                        wan_udp_pkt->wan_udp_data_len = 1;
        !           928:                        break;
        !           929:
        !           930:                case WAN_GET_PLATFORM:
        !           931:                        wan_udp_pkt->wan_udp_data[0] = WAN_PLATFORM_ID;
        !           932:                        wan_udp_pkt->wan_udp_return_code = WAN_CMD_OK;
        !           933:                        wan_udp_pkt->wan_udp_data_len = 1;
        !           934:                        break;
        !           935:
        !           936:                default:
        !           937:                        wan_udp_pkt->wan_udp_data_len = 0;
        !           938:                        wan_udp_pkt->wan_udp_return_code = 0xCD;
        !           939:
        !           940:                        log(LOG_INFO, "%s: Warning, Illegal UDP "
        !           941:                            "command attempted from network: %x\n",
        !           942:                            card->devname, wan_udp_pkt->wan_udp_command);
        !           943:                        break;
        !           944:                }
        !           945:        }
        !           946:
        !           947:        wan_udp_pkt->wan_udp_request_reply = UDPMGMT_REPLY;
        !           948:        return (1);
        !           949: }
        !           950:
        !           951: /*
        !           952:  * FIRMWARE Specific Interface Functions
        !           953:  */
        !           954:
        !           955: static int
        !           956: xilinx_chip_configure(sdla_t *card)
        !           957: {
        !           958:        u_int32_t reg, tmp;
        !           959:        int err = 0;
        !           960:        u_int16_t adapter_type, adptr_security;
        !           961:
        !           962: #ifdef DEBUG_INIT
        !           963:        log(LOG_DEBUG, "Xilinx Chip Configuration. -- \n");
        !           964: #endif
        !           965:        xilinx_delay(1);
        !           966:
        !           967:        sdla_bus_read_4(card->hw, XILINX_CHIP_CFG_REG, &reg);
        !           968:
        !           969:        /* Configure for T1 or E1 front end */
        !           970:        if (IS_T1(&card->fe_te.te_cfg)) {
        !           971:                card->u.xilinx.num_of_time_slots = NUM_OF_T1_CHANNELS;
        !           972:                bit_clear((u_int8_t *)&reg, INTERFACE_TYPE_T1_E1_BIT);
        !           973:                bit_set((u_int8_t *)&reg, FRONT_END_FRAME_FLAG_ENABLE_BIT);
        !           974:        } else if (IS_E1(&card->fe_te.te_cfg)) {
        !           975:                card->u.xilinx.num_of_time_slots = NUM_OF_E1_CHANNELS;
        !           976:                bit_set((u_int8_t *)&reg, INTERFACE_TYPE_T1_E1_BIT);
        !           977:                bit_set((u_int8_t *)&reg, FRONT_END_FRAME_FLAG_ENABLE_BIT);
        !           978:        } else {
        !           979:                log(LOG_INFO, "%s: Error: Xilinx doesn't "
        !           980:                    "support non T1/E1 interface!\n", card->devname);
        !           981:                return (EINVAL);
        !           982:        }
        !           983:
        !           984:        sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, reg);
        !           985:
        !           986:        DELAY(10000);
        !           987:
        !           988:        /* Reset PMC */
        !           989:        sdla_bus_read_4(card->hw, XILINX_CHIP_CFG_REG, &reg);
        !           990:        bit_clear((u_int8_t *)&reg, FRONT_END_RESET_BIT);
        !           991:        sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, reg);
        !           992:        DELAY(1000);
        !           993:
        !           994:        bit_set((u_int8_t *)&reg, FRONT_END_RESET_BIT);
        !           995:        sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, reg);
        !           996:        DELAY(100);
        !           997:
        !           998: #ifdef DEBUG_INIT
        !           999:        log(LOG_DEBUG, "--- Chip Reset. -- \n");
        !          1000: #endif
        !          1001:
        !          1002:        /* Reset Chip Core */
        !          1003:        sdla_bus_read_4(card->hw, XILINX_CHIP_CFG_REG, &reg);
        !          1004:        bit_set((u_int8_t *)&reg, CHIP_RESET_BIT);
        !          1005:        sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, reg);
        !          1006:
        !          1007:        DELAY(100);
        !          1008:
        !          1009:        /* Disable the chip/hdlc reset condition */
        !          1010:        bit_clear((u_int8_t *)&reg, CHIP_RESET_BIT);
        !          1011:
        !          1012:        /* Disable ALL chip interrupts */
        !          1013:        bit_clear((u_int8_t *)&reg, GLOBAL_INTR_ENABLE_BIT);
        !          1014:        bit_clear((u_int8_t *)&reg, ERROR_INTR_ENABLE_BIT);
        !          1015:        bit_clear((u_int8_t *)&reg, FRONT_END_INTR_ENABLE_BIT);
        !          1016:
        !          1017:        sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, reg);
        !          1018:
        !          1019:        xilinx_delay(1);
        !          1020:
        !          1021:        sdla_getcfg(card->hw, SDLA_ADAPTERTYPE, &adapter_type);
        !          1022:        DELAY(100);
        !          1023:
        !          1024: #ifdef DEBUG_INIT
        !          1025:        log(LOG_INFO, "%s: Hardware Adapter Type 0x%X\n",
        !          1026:            card->devname, adapter_type);
        !          1027: #endif
        !          1028:
        !          1029:        adptr_security = read_cpld(card, SECURITY_CPLD_REG);
        !          1030:        adptr_security = adptr_security >> SECURITY_CPLD_SHIFT;
        !          1031:        adptr_security = adptr_security & SECURITY_CPLD_MASK;
        !          1032:
        !          1033: #ifdef DEBUG_INIT
        !          1034:        switch (adptr_security) {
        !          1035:        case SECURITY_1LINE_UNCH:
        !          1036:                log(LOG_INFO, "%s: Security 1 Line UnCh\n", card->devname);
        !          1037:                break;
        !          1038:        case SECURITY_1LINE_CH:
        !          1039:                log(LOG_INFO, "%s: Security 1 Line Ch\n", card->devname);
        !          1040:                break;
        !          1041:        case SECURITY_2LINE_UNCH:
        !          1042:                log(LOG_INFO, "%s: Security 2 Line UnCh\n", card->devname);
        !          1043:                break;
        !          1044:        case SECURITY_2LINE_CH:
        !          1045:                log(LOG_INFO, "%s: Security 2 Line Ch\n", card->devname);
        !          1046:                break;
        !          1047:        default:
        !          1048:                log(LOG_INFO, "%s: Error Invalid Security ID = 0x%X\n",
        !          1049:                    card->devname, adptr_security);
        !          1050:                /* return EINVAL;*/
        !          1051:        }
        !          1052: #endif
        !          1053:
        !          1054:        /* Turn off Onboard RED LED */
        !          1055:        sdla_bus_read_4(card->hw, XILINX_CHIP_CFG_REG, &reg);
        !          1056:        bit_set((u_int8_t *)&reg, XILINX_RED_LED);
        !          1057:        sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, reg);
        !          1058:        DELAY(10);
        !          1059:
        !          1060:        err = aft_core_ready(card);
        !          1061:        if (err != 0)
        !          1062:                log(LOG_INFO, "%s: WARNING: HDLC Core Not Ready: B4 TE CFG!\n",
        !          1063:                    card->devname);
        !          1064:
        !          1065:        log(LOG_INFO, "%s: Configuring A101 PMC T1/E1/J1 Front End\n",
        !          1066:            card->devname);
        !          1067:
        !          1068:        if (sdla_te_config(card)) {
        !          1069:                log(LOG_INFO, "%s: Failed %s configuratoin!\n", card->devname,
        !          1070:                    IS_T1(&card->fe_te.te_cfg)?"T1":"E1");
        !          1071:                return (EINVAL);
        !          1072:        }
        !          1073:
        !          1074:        xilinx_delay(1);
        !          1075:
        !          1076:        err = aft_core_ready(card);
        !          1077:        if (err != 0) {
        !          1078:                log(LOG_INFO, "%s: Error: HDLC Core Not Ready!\n",
        !          1079:                    card->devname);
        !          1080:
        !          1081:                sdla_bus_read_4(card->hw, XILINX_CHIP_CFG_REG, &reg);
        !          1082:
        !          1083:                /* Disable the chip/hdlc reset condition */
        !          1084:                bit_set((u_int8_t *)&reg, CHIP_RESET_BIT);
        !          1085:
        !          1086:                sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, reg);
        !          1087:                return (err);
        !          1088:        }
        !          1089:
        !          1090: #ifdef DEBUG_INIT
        !          1091:        log(LOG_INFO, "%s: HDLC Core Ready 0x%08X\n",
        !          1092:            card->devname, reg);
        !          1093: #endif
        !          1094:
        !          1095:        xilinx_delay(1);
        !          1096:
        !          1097:        /* Setup global DMA parameters */
        !          1098:        reg = 0;
        !          1099:        reg|=(XILINX_DMA_SIZE    << DMA_SIZE_BIT_SHIFT);
        !          1100:        reg|=(XILINX_DMA_FIFO_UP << DMA_FIFO_HI_MARK_BIT_SHIFT);
        !          1101:        reg|=(XILINX_DMA_FIFO_LO << DMA_FIFO_LO_MARK_BIT_SHIFT);
        !          1102:
        !          1103:        /*
        !          1104:         * Enable global DMA engine and set to default
        !          1105:         * number of active channels. Note: this value will
        !          1106:         * change in dev configuration
        !          1107:         */
        !          1108:        reg|=(XILINX_DEFLT_ACTIVE_CH << DMA_ACTIVE_CHANNEL_BIT_SHIFT);
        !          1109:        bit_set((u_int8_t *)&reg, DMA_ENGINE_ENABLE_BIT);
        !          1110:
        !          1111: #ifdef DEBUG_INIT
        !          1112:        log(LOG_INFO, "--- Setup DMA control Reg. -- \n");
        !          1113: #endif
        !          1114:
        !          1115:        sdla_bus_write_4(card->hw, XILINX_DMA_CONTROL_REG, reg);
        !          1116:
        !          1117: #ifdef DEBUG_INIT
        !          1118:        log(LOG_INFO, "--- Tx/Rx global enable. -- \n");
        !          1119: #endif
        !          1120:
        !          1121:        xilinx_delay(1);
        !          1122:
        !          1123:        reg = 0;
        !          1124:        sdla_bus_write_4(card->hw, XILINX_TIMESLOT_HDLC_CHAN_REG, reg);
        !          1125:
        !          1126:        /* Clear interrupt pending registers befor first interrupt enable */
        !          1127:        sdla_bus_read_4(card->hw, XILINX_DMA_RX_INTR_PENDING_REG, &tmp);
        !          1128:        sdla_bus_read_4(card->hw, XILINX_DMA_TX_INTR_PENDING_REG, &tmp);
        !          1129:        sdla_bus_read_4(card->hw, XILINX_HDLC_RX_INTR_PENDING_REG, &tmp);
        !          1130:        sdla_bus_read_4(card->hw, XILINX_HDLC_TX_INTR_PENDING_REG, &tmp);
        !          1131:        sdla_bus_read_4(card->hw, XILINX_CHIP_CFG_REG, (u_int32_t *)&reg);
        !          1132:        if (bit_test((u_int8_t *)&reg, DMA_INTR_FLAG)) {
        !          1133:                log(LOG_INFO, "%s: Error: Active DMA Interrupt Pending. !\n",
        !          1134:                    card->devname);
        !          1135:
        !          1136:                reg = 0;
        !          1137:                /* Disable the chip/hdlc reset condition */
        !          1138:                bit_set((u_int8_t *)&reg, CHIP_RESET_BIT);
        !          1139:                sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, reg);
        !          1140:                return (err);
        !          1141:        }
        !          1142:        if (bit_test((u_int8_t *)&reg, ERROR_INTR_FLAG)) {
        !          1143:                log(LOG_INFO, "%s: Error: Active Error Interrupt Pending. !\n",
        !          1144:                    card->devname);
        !          1145:
        !          1146:                reg = 0;
        !          1147:                /* Disable the chip/hdlc reset condition */
        !          1148:                bit_set((u_int8_t *)&reg, CHIP_RESET_BIT);
        !          1149:                sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, reg);
        !          1150:                return (err);
        !          1151:        }
        !          1152:
        !          1153:
        !          1154:        /* Alawys disable global data and error interrupts */
        !          1155:        bit_clear((u_int8_t *)&reg, GLOBAL_INTR_ENABLE_BIT);
        !          1156:        bit_clear((u_int8_t *)&reg, ERROR_INTR_ENABLE_BIT);
        !          1157:
        !          1158:        /* Always enable the front end interrupt */
        !          1159:        bit_set((u_int8_t *)&reg, FRONT_END_INTR_ENABLE_BIT);
        !          1160:
        !          1161: #ifdef DEBUG_INIT
        !          1162:        log(LOG_DEBUG, "--- Set Global Interrupts (0x%X)-- \n", reg);
        !          1163: #endif
        !          1164:
        !          1165:        xilinx_delay(1);
        !          1166:
        !          1167:        sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, reg);
        !          1168:
        !          1169:        return (err);
        !          1170: }
        !          1171:
        !          1172: static int
        !          1173: xilinx_chip_unconfigure(sdla_t *card)
        !          1174: {
        !          1175:        u_int32_t       reg = 0;
        !          1176:
        !          1177:        sdla_bus_write_4(card->hw, XILINX_TIMESLOT_HDLC_CHAN_REG, reg);
        !          1178:        sdla_bus_read_4(card->hw, XILINX_CHIP_CFG_REG, &reg);
        !          1179:        /* Enable the chip/hdlc reset condition */
        !          1180:        reg = 0;
        !          1181:        bit_set((u_int8_t *)&reg, CHIP_RESET_BIT);
        !          1182:
        !          1183:        sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, reg);
        !          1184:        return (0);
        !          1185: }
        !          1186:
        !          1187: static int
        !          1188: xilinx_dev_configure(sdla_t *card, xilinx_softc_t *sc)
        !          1189: {
        !          1190:        u_int32_t reg;
        !          1191:        long free_logic_ch, i;
        !          1192:
        !          1193:        sc->logic_ch_num=-1;
        !          1194:
        !          1195:        if (!IS_TE1(&card->fe_te.te_cfg))
        !          1196:                return (EINVAL);
        !          1197:
        !          1198:        if (IS_E1(&card->fe_te.te_cfg)) {
        !          1199:                log(LOG_DEBUG, "%s: Time Slot Orig 0x%lX  Shifted 0x%lX\n",
        !          1200:                    sc->if_name, sc->time_slot_map, sc->time_slot_map << 1);
        !          1201:                sc->time_slot_map = sc->time_slot_map << 1;
        !          1202:                bit_clear((u_int8_t *)&sc->time_slot_map, 0);
        !          1203:        }
        !          1204:
        !          1205:        /*
        !          1206:         * Channel definition section. If not channels defined
        !          1207:         * return error
        !          1208:         */
        !          1209:        if (sc->time_slot_map == 0) {
        !          1210:                log(LOG_INFO, "%s: Invalid Channel Selection 0x%lX\n",
        !          1211:                    card->devname, sc->time_slot_map);
        !          1212:                return (EINVAL);
        !          1213:        }
        !          1214:
        !          1215: #ifdef DEBUG_INIT
        !          1216:        log(LOG_INFO, "%s:%s: Active channels = 0x%lX\n", card->devname,
        !          1217:            sc->if_name, sc->time_slot_map);
        !          1218: #endif
        !          1219:        xilinx_delay(1);
        !          1220:
        !          1221:        /*
        !          1222:         * Check that the time slot is not being used. If it is
        !          1223:         * stop the interface setup.  Notice, though we proceed
        !          1224:         * to check for all timeslots before we start binding
        !          1225:         * the channels in.  This way, we don't have to go back
        !          1226:         * and clean the time_slot_map
        !          1227:         */
        !          1228:        for (i = 0; i < card->u.xilinx.num_of_time_slots; i++) {
        !          1229:                if (bit_test((u_int8_t *)&sc->time_slot_map, i)) {
        !          1230:
        !          1231:                        if (sc->first_time_slot == -1) {
        !          1232: #ifdef DEBUG_INIT
        !          1233:                                log(LOG_INFO, "%s: Setting first time "
        !          1234:                                    "slot to %ld\n", card->devname, i);
        !          1235: #endif
        !          1236:                                sc->first_time_slot = i;
        !          1237:                        }
        !          1238:
        !          1239: #ifdef DEBUG_INIT
        !          1240:                        log(LOG_DEBUG, "%s: Configuring %s for timeslot %ld\n",
        !          1241:                            card->devname, sc->if_name,
        !          1242:                            IS_E1(&card->fe_te.te_cfg)?i:i+1);
        !          1243: #endif
        !          1244:                        if (bit_test((u_int8_t *)
        !          1245:                            &card->u.xilinx.time_slot_map, i)) {
        !          1246:                                log(LOG_INFO, "%s: Channel/Time Slot "
        !          1247:                                    "resource conflict!\n", card->devname);
        !          1248:                                log(LOG_INFO, "%s: %s: Channel/Time Slot "
        !          1249:                                    "%ld, aready in use!\n",
        !          1250:                                    card->devname, sc->if_name, (i+1));
        !          1251:
        !          1252:                                return (EEXIST);
        !          1253:                        }
        !          1254:
        !          1255:                        /* Calculate the number of timeslots for this if */
        !          1256:                        ++sc->num_of_time_slots;
        !          1257:                }
        !          1258:        }
        !          1259:
        !          1260:        xilinx_delay(1);
        !          1261:
        !          1262:        sc->logic_ch_num = request_xilinx_logical_channel_num(card,
        !          1263:            sc, &free_logic_ch);
        !          1264:        if (sc->logic_ch_num == -1)
        !          1265:                return (EBUSY);
        !          1266:
        !          1267:        xilinx_delay(1);
        !          1268:
        !          1269:        for (i = 0; i < card->u.xilinx.num_of_time_slots; i++) {
        !          1270:                if (bit_test((u_int8_t *)&sc->time_slot_map, i)) {
        !          1271:
        !          1272:                        bit_set((u_int8_t *)&card->u.xilinx.time_slot_map, i);
        !          1273:
        !          1274:                        sdla_bus_read_4(card->hw,
        !          1275:                            XILINX_TIMESLOT_HDLC_CHAN_REG, &reg);
        !          1276:                        reg &= ~TIMESLOT_BIT_MASK;
        !          1277:
        !          1278:                        /* FIXME do not hardcode !*/
        !          1279:                        reg &= HDLC_LCH_TIMESLOT_MASK; /* mask not valid bits*/
        !          1280:
        !          1281:                        /* Select a Timeslot for configuration */
        !          1282:                        sdla_bus_write_4(card->hw,
        !          1283:                            XILINX_TIMESLOT_HDLC_CHAN_REG,
        !          1284:                            (reg | (i << TIMESLOT_BIT_SHIFT)));
        !          1285:
        !          1286:                        reg = sc->logic_ch_num & CONTROL_RAM_DATA_MASK;
        !          1287:
        !          1288: #ifdef TRUE_FIFO_SIZE
        !          1289:                        reg |= (sc->fifo_size_code & HDLC_FIFO_SIZE_MASK) <<
        !          1290:                            HDLC_FIFO_SIZE_SHIFT;
        !          1291: #else
        !          1292:                        reg |= (HARD_FIFO_CODE &
        !          1293:                            HDLC_FIFO_SIZE_MASK) << HDLC_FIFO_SIZE_SHIFT;
        !          1294: #endif /* TRUE_FIFO_SIZE */
        !          1295:
        !          1296:                        reg |= (sc->fifo_base_addr & HDLC_FIFO_BASE_ADDR_MASK)
        !          1297:                            << HDLC_FIFO_BASE_ADDR_SHIFT;
        !          1298:
        !          1299: #ifdef DEBUG_INIT
        !          1300:                        log(LOG_INFO, "Setting Timeslot %ld to logic "
        !          1301:                            "ch %ld Reg=0x%X\n", i, sc->logic_ch_num, reg);
        !          1302: #endif
        !          1303:                        xilinx_write_ctrl_hdlc(card, i,
        !          1304:                            XILINX_CONTROL_RAM_ACCESS_BUF, reg);
        !          1305:                }
        !          1306:        }
        !          1307:
        !          1308:        if (free_logic_ch != -1) {
        !          1309:
        !          1310:                char free_ch_used = 0;
        !          1311:
        !          1312:                for (i = 0; i < card->u.xilinx.num_of_time_slots; i++) {
        !          1313:                        if (!bit_test((u_int8_t *)
        !          1314:                            &card->u.xilinx.time_slot_map, i)) {
        !          1315:
        !          1316:                                sdla_bus_read_4(card->hw,
        !          1317:                                    XILINX_TIMESLOT_HDLC_CHAN_REG, &reg);
        !          1318:
        !          1319:                                reg &= ~TIMESLOT_BIT_MASK;
        !          1320:                                /* mask not valid bits */
        !          1321:                                reg &= HDLC_LCH_TIMESLOT_MASK;
        !          1322:
        !          1323:                                /* Select a Timeslot for configuration */
        !          1324:                                sdla_bus_write_4(card->hw,
        !          1325:                                    XILINX_TIMESLOT_HDLC_CHAN_REG,
        !          1326:                                    (reg | (i << TIMESLOT_BIT_SHIFT)));
        !          1327:
        !          1328:                                reg = free_logic_ch&CONTROL_RAM_DATA_MASK;
        !          1329:
        !          1330:                                /* For the rest of the unused logic channels
        !          1331:                                 * bind them to timeslot 31 and set the fifo
        !          1332:                                 * size to 32 byte = Code = 0x00 */
        !          1333:                                reg |= (FIFO_32B & HDLC_FIFO_SIZE_MASK)
        !          1334:                                    << HDLC_FIFO_SIZE_SHIFT;
        !          1335:
        !          1336:                                reg |= (free_logic_ch &
        !          1337:                                    HDLC_FIFO_BASE_ADDR_MASK) <<
        !          1338:                                    HDLC_FIFO_BASE_ADDR_SHIFT;
        !          1339:
        !          1340: #ifdef DEBUG_INIT
        !          1341:                                log(LOG_INFO, "Setting Timeslot "
        !          1342:                                    "%ld to free logic ch %ld Reg=0x%X\n",
        !          1343:                                    i, free_logic_ch, reg);
        !          1344: #endif
        !          1345:                                xilinx_write_ctrl_hdlc(card, i,
        !          1346:                                    XILINX_CONTROL_RAM_ACCESS_BUF, reg);
        !          1347:
        !          1348:                                free_ch_used = 1;
        !          1349:                        }
        !          1350:                }
        !          1351:
        !          1352:                /* We must check if the free logic has been bound
        !          1353:                 * to any timeslots */
        !          1354:                if (free_ch_used) {
        !          1355: #ifdef DEBUG_INIT
        !          1356:                        log(LOG_INFO, "%s: Setting Free CH %ld to idle\n",
        !          1357:                            sc->if_name, free_logic_ch);
        !          1358: #endif
        !          1359:                        xilinx_delay(1);
        !          1360:
        !          1361:                        /* Setup the free logic channel as IDLE */
        !          1362:
        !          1363:                        sdla_bus_read_4(card->hw,
        !          1364:                            XILINX_TIMESLOT_HDLC_CHAN_REG, &reg);
        !          1365:
        !          1366:                        reg &= ~HDLC_LOGIC_CH_BIT_MASK;
        !          1367:
        !          1368:                        /* mask not valid bits */
        !          1369:                        reg &= HDLC_LCH_TIMESLOT_MASK;
        !          1370:
        !          1371:                        sdla_bus_write_4(card->hw,
        !          1372:                            XILINX_TIMESLOT_HDLC_CHAN_REG,
        !          1373:                            (reg|(free_logic_ch&HDLC_LOGIC_CH_BIT_MASK)));
        !          1374:
        !          1375:                        reg = 0;
        !          1376:                        bit_clear((u_int8_t *)&reg, HDLC_RX_PROT_DISABLE_BIT);
        !          1377:                        bit_clear((u_int8_t *)&reg, HDLC_TX_PROT_DISABLE_BIT);
        !          1378:
        !          1379:                        bit_set((u_int8_t *)&reg, HDLC_RX_ADDR_RECOGN_DIS_BIT);
        !          1380:
        !          1381:                        xilinx_write_ctrl_hdlc(card, sc->first_time_slot,
        !          1382:                            XILINX_HDLC_CONTROL_REG, reg);
        !          1383:                }
        !          1384:        }
        !          1385:
        !          1386:        /* Select an HDLC logic channel for configuration */
        !          1387:        sdla_bus_read_4(card->hw, XILINX_TIMESLOT_HDLC_CHAN_REG, &reg);
        !          1388:
        !          1389:        reg &= ~HDLC_LOGIC_CH_BIT_MASK;
        !          1390:        reg &= HDLC_LCH_TIMESLOT_MASK;         /* mask not valid bits */
        !          1391:
        !          1392:        sdla_bus_write_4(card->hw, XILINX_TIMESLOT_HDLC_CHAN_REG,
        !          1393:            (reg | (sc->logic_ch_num & HDLC_LOGIC_CH_BIT_MASK)));
        !          1394:
        !          1395:        reg = 0;
        !          1396:
        !          1397:        /* HDLC engine is enabled on the above logical channels */
        !          1398:        bit_clear((u_int8_t *)&reg, HDLC_RX_PROT_DISABLE_BIT);
        !          1399:        bit_clear((u_int8_t *)&reg, HDLC_TX_PROT_DISABLE_BIT);
        !          1400:
        !          1401:        bit_set((u_int8_t *)&reg, HDLC_TX_CHAN_ENABLE_BIT);
        !          1402:        bit_set((u_int8_t *)&reg, HDLC_RX_ADDR_RECOGN_DIS_BIT);
        !          1403:
        !          1404:        xilinx_write_ctrl_hdlc(card, sc->first_time_slot,
        !          1405:            XILINX_HDLC_CONTROL_REG, reg);
        !          1406:
        !          1407:        return (0);
        !          1408: }
        !          1409:
        !          1410: static void
        !          1411: xilinx_dev_unconfigure(sdla_t *card, xilinx_softc_t *sc)
        !          1412: {
        !          1413:        u_int32_t reg;
        !          1414:        int i, s;
        !          1415:
        !          1416: #ifdef DEBUG_INIT
        !          1417:        log(LOG_DEBUG, "\n-- Unconfigure Xilinx. --\n");
        !          1418: #endif
        !          1419:
        !          1420:        /* Select an HDLC logic channel for configuration */
        !          1421:        if (sc->logic_ch_num != -1) {
        !          1422:
        !          1423:                sdla_bus_read_4(card->hw, XILINX_TIMESLOT_HDLC_CHAN_REG, &reg);
        !          1424:                reg &= ~HDLC_LOGIC_CH_BIT_MASK;
        !          1425:                reg &= HDLC_LCH_TIMESLOT_MASK;  /* mask not valid bits */
        !          1426:
        !          1427:                sdla_bus_write_4(card->hw, XILINX_TIMESLOT_HDLC_CHAN_REG,
        !          1428:                    (reg | (sc->logic_ch_num & HDLC_LOGIC_CH_BIT_MASK)));
        !          1429:
        !          1430:                reg = 0x00020000;
        !          1431:                xilinx_write_ctrl_hdlc(card, sc->first_time_slot,
        !          1432:                    XILINX_HDLC_CONTROL_REG, reg);
        !          1433:
        !          1434:                for (i = 0; i < card->u.xilinx.num_of_time_slots; i++) {
        !          1435:                        if (bit_test((u_int8_t *)&sc->time_slot_map, i)) {
        !          1436:                                sdla_bus_read_4(card->hw,
        !          1437:                                    XILINX_TIMESLOT_HDLC_CHAN_REG, &reg);
        !          1438:                                reg &= ~TIMESLOT_BIT_MASK;
        !          1439:
        !          1440:                                /* mask not valid bits */
        !          1441:                                reg &= HDLC_LCH_TIMESLOT_MASK;
        !          1442:
        !          1443:                                /* Select a Timeslot for configuration */
        !          1444:                                sdla_bus_write_4(card->hw,
        !          1445:                                    XILINX_TIMESLOT_HDLC_CHAN_REG,
        !          1446:                                    (reg | (i<<TIMESLOT_BIT_SHIFT)));
        !          1447:
        !          1448:                                reg = 31 & CONTROL_RAM_DATA_MASK;
        !          1449:                                reg |= (FIFO_32B & HDLC_FIFO_SIZE_MASK) <<
        !          1450:                                    HDLC_FIFO_SIZE_SHIFT;
        !          1451:                                reg |= (31 & HDLC_FIFO_BASE_ADDR_MASK) <<
        !          1452:                                    HDLC_FIFO_BASE_ADDR_SHIFT;
        !          1453:
        !          1454: #ifdef DEBUG_INIT
        !          1455:                                log(LOG_INFO, "Setting Timeslot %d "
        !          1456:                                    "to logic ch %d Reg=0x%X\n", i, 31 , reg);
        !          1457: #endif
        !          1458:                                xilinx_write_ctrl_hdlc(card, i,
        !          1459:                                    XILINX_CONTROL_RAM_ACCESS_BUF, reg);
        !          1460:                        }
        !          1461:                }
        !          1462:
        !          1463:                /*
        !          1464:                 * Lock to protect the logic ch map to sc device array
        !          1465:                 */
        !          1466:                s = splnet();
        !          1467:                free_xilinx_logical_channel_num(card, sc->logic_ch_num);
        !          1468:                for (i = 0; i < card->u.xilinx.num_of_time_slots; i++)
        !          1469:                        if (bit_test((u_int8_t *)&sc->time_slot_map, i))
        !          1470:                                --sc->num_of_time_slots;
        !          1471:
        !          1472:                free_fifo_baddr_and_size(card, sc);
        !          1473:                splx(s);
        !          1474:
        !          1475:                sc->logic_ch_num = -1;
        !          1476:
        !          1477:                for (i = 0; i < card->u.xilinx.num_of_time_slots; i++)
        !          1478:                        if (bit_test((u_int8_t *)&sc->time_slot_map, i))
        !          1479:                                bit_clear((u_int8_t *)
        !          1480:                                    &card->u.xilinx.time_slot_map, i);
        !          1481:        }
        !          1482: }
        !          1483:
        !          1484: #define FIFO_RESET_TIMEOUT_CNT 1000
        !          1485: #define FIFO_RESET_TIMEOUT_US  10
        !          1486: static int
        !          1487: xilinx_init_rx_dev_fifo(sdla_t *card, xilinx_softc_t *sc, unsigned char wait)
        !          1488: {
        !          1489:        u_int32_t reg;
        !          1490:        u_int32_t dma_descr;
        !          1491:        u_int8_t  timeout = 1;
        !          1492:        u_int16_t i;
        !          1493:
        !          1494:        /* Clean RX DMA fifo */
        !          1495:        dma_descr = (unsigned long)(sc->logic_ch_num << 4) +
        !          1496:            XILINX_RxDMA_DESCRIPTOR_HI;
        !          1497:        reg = 0;
        !          1498:        bit_set((u_int8_t *)&reg, INIT_DMA_FIFO_CMD_BIT);
        !          1499:
        !          1500: #ifdef DEBUG_INIT
        !          1501:        log(LOG_DEBUG,
        !          1502:            "%s: Clearing RX Fifo DmaDescr=(0x%X) Reg=(0x%X) (%s)\n",
        !          1503:            sc->if_name, dma_descr, reg, __FUNCTION__);
        !          1504: #endif
        !          1505:
        !          1506:        sdla_bus_write_4(card->hw, dma_descr, reg);
        !          1507:
        !          1508:        if (wait == WP_WAIT) {
        !          1509:                for (i = 0; i < FIFO_RESET_TIMEOUT_CNT; i++) {
        !          1510:                        sdla_bus_read_4(card->hw, dma_descr, &reg);
        !          1511:                        if (bit_test((u_int8_t *)&reg, INIT_DMA_FIFO_CMD_BIT)) {
        !          1512:                                DELAY(FIFO_RESET_TIMEOUT_US);
        !          1513:                                continue;
        !          1514:                        }
        !          1515:                        timeout = 0;
        !          1516:                        break;
        !          1517:                }
        !          1518:
        !          1519: #ifdef DEBUG_INIT
        !          1520:                if (timeout)
        !          1521:                        log(LOG_INFO, "%s:%s: Error: Rx fifo reset "
        !          1522:                            "timedout %u us\n", card->devname,
        !          1523:                            sc->if_name, i * FIFO_RESET_TIMEOUT_US);
        !          1524:                else
        !          1525:                        log(LOG_INFO, "%s:%s: Rx Fifo reset "
        !          1526:                            "successful %u us\n", card->devname, sc->if_name,
        !          1527:                            i * FIFO_RESET_TIMEOUT_US);
        !          1528: #endif
        !          1529:        } else
        !          1530:                timeout = 0;
        !          1531:
        !          1532:        return (timeout);
        !          1533: }
        !          1534:
        !          1535: static int
        !          1536: xilinx_init_tx_dev_fifo(sdla_t *card, xilinx_softc_t *sc, unsigned char wait)
        !          1537: {
        !          1538:        u_int32_t reg;
        !          1539:        u_int32_t dma_descr;
        !          1540:        u_int8_t  timeout = 1;
        !          1541:        u_int16_t i;
        !          1542:
        !          1543:        /* Clean TX DMA fifo */
        !          1544:        dma_descr = (unsigned long)(sc->logic_ch_num << 4) +
        !          1545:            XILINX_TxDMA_DESCRIPTOR_HI;
        !          1546:        reg = 0;
        !          1547:        bit_set((u_int8_t *)&reg, INIT_DMA_FIFO_CMD_BIT);
        !          1548:
        !          1549: #ifdef DEBUG_INIT
        !          1550:        log(LOG_DEBUG,
        !          1551:            "%s: Clearing TX Fifo DmaDescr=(0x%X) Reg=(0x%X) (%s)\n",
        !          1552:            sc->if_name, dma_descr, reg, __FUNCTION__);
        !          1553: #endif
        !          1554:        sdla_bus_write_4(card->hw, dma_descr, reg);
        !          1555:
        !          1556:        if (wait == WP_WAIT) {
        !          1557:                for (i = 0; i < FIFO_RESET_TIMEOUT_CNT; i++) {
        !          1558:                        sdla_bus_read_4(card->hw, dma_descr, &reg);
        !          1559:                        if (bit_test((u_int8_t *)&reg, INIT_DMA_FIFO_CMD_BIT)) {
        !          1560:                                DELAY(FIFO_RESET_TIMEOUT_US);
        !          1561:                                continue;
        !          1562:                        }
        !          1563:                        timeout = 0;
        !          1564:                        break;
        !          1565:                }
        !          1566:
        !          1567: #ifdef DEBUG_INIT
        !          1568:                if (timeout)
        !          1569:                        log(LOG_INFO, "%s:%s: Error: Tx fifo reset "
        !          1570:                            "timedout %u us\n", card->devname, sc->if_name,
        !          1571:                            i * FIFO_RESET_TIMEOUT_US);
        !          1572:                else
        !          1573:                        log(LOG_INFO, "%s:%s: Tx Fifo reset "
        !          1574:                            "successful %u us\n", card->devname, sc->if_name,
        !          1575:                            i * FIFO_RESET_TIMEOUT_US);
        !          1576: #endif
        !          1577:        } else
        !          1578:                timeout = 0;
        !          1579:
        !          1580:        return (timeout);
        !          1581: }
        !          1582:
        !          1583:
        !          1584: static void
        !          1585: xilinx_dev_enable(sdla_t *card, xilinx_softc_t *sc)
        !          1586: {
        !          1587:        u_int32_t reg;
        !          1588:
        !          1589: #ifdef DEBUG_INIT
        !          1590:        log(LOG_INFO, "%s: Enabling Global Inter Mask !\n", sc->if_name);
        !          1591: #endif
        !          1592:        /* Enable Logic Channel Interrupts for DMA and fifo */
        !          1593:        sdla_bus_read_4(card->hw, XILINX_GLOBAL_INTER_MASK, &reg);
        !          1594:        bit_set((u_int8_t *)&reg, sc->logic_ch_num);
        !          1595:
        !          1596:        sdla_bus_write_4(card->hw, XILINX_GLOBAL_INTER_MASK, reg);
        !          1597:
        !          1598:        bit_set((u_int8_t *)&card->u.xilinx.active_ch_map, sc->logic_ch_num);
        !          1599: }
        !          1600:
        !          1601: static void
        !          1602: xilinx_dev_close(sdla_t *card, xilinx_softc_t *sc)
        !          1603: {
        !          1604:        u_int32_t reg;
        !          1605:        unsigned long dma_descr;
        !          1606:        int s;
        !          1607:
        !          1608: #ifdef DEBUG_INIT
        !          1609:        log(LOG_DEBUG, "-- Close Xilinx device. --\n");
        !          1610: #endif
        !          1611:        /* Disable Logic Channel Interrupts for DMA and fifo */
        !          1612:        sdla_bus_read_4(card->hw, XILINX_GLOBAL_INTER_MASK, &reg);
        !          1613:
        !          1614:        bit_clear((u_int8_t *)&reg, sc->logic_ch_num);
        !          1615:        bit_clear((u_int8_t *)&card->u.xilinx.active_ch_map, sc->logic_ch_num);
        !          1616:
        !          1617:        /*
        !          1618:         * We are masking the sc interrupt.
        !          1619:         * Lock to make sure that the interrupt is
        !          1620:         * not running
        !          1621:         */
        !          1622:        s = splnet();
        !          1623:        sdla_bus_write_4(card->hw, XILINX_GLOBAL_INTER_MASK, reg);
        !          1624:        splx(s);
        !          1625:
        !          1626:        reg = 0;
        !          1627:
        !          1628:        /* Select an HDLC logic channel for configuration */
        !          1629:        sdla_bus_read_4(card->hw, XILINX_TIMESLOT_HDLC_CHAN_REG, &reg);
        !          1630:
        !          1631:        reg &= ~HDLC_LOGIC_CH_BIT_MASK;
        !          1632:        reg &= HDLC_LCH_TIMESLOT_MASK;         /* mask not valid bits */
        !          1633:
        !          1634:        sdla_bus_write_4(card->hw, XILINX_TIMESLOT_HDLC_CHAN_REG,
        !          1635:            (reg | (sc->logic_ch_num & HDLC_LOGIC_CH_BIT_MASK)));
        !          1636:
        !          1637:
        !          1638:        reg = 0;
        !          1639:        xilinx_write_ctrl_hdlc(card, sc->first_time_slot,
        !          1640:            XILINX_HDLC_CONTROL_REG, reg);
        !          1641:
        !          1642:        /* Clear descriptors */
        !          1643:        reg = 0;
        !          1644:        dma_descr=(sc->logic_ch_num<<4) + XILINX_RxDMA_DESCRIPTOR_HI;
        !          1645:        sdla_bus_write_4(card->hw, dma_descr, reg);
        !          1646:        dma_descr=(sc->logic_ch_num<<4) + XILINX_TxDMA_DESCRIPTOR_HI;
        !          1647:        sdla_bus_write_4(card->hw, dma_descr, reg);
        !          1648:
        !          1649:        /* FIXME: Cleanp up Tx and Rx buffers */
        !          1650: }
        !          1651:
        !          1652: static int
        !          1653: xilinx_dma_rx(sdla_t *card, xilinx_softc_t *sc)
        !          1654: {
        !          1655:        u_int32_t reg;
        !          1656:        unsigned long dma_descr;
        !          1657:        unsigned long bus_addr;
        !          1658:        wp_rx_element_t *rx_el;
        !          1659:
        !          1660:        /* sanity check: make sure that DMA is in ready state */
        !          1661: #if 0
        !          1662:        dma_descr=(sc->logic_ch_num<<4) + XILINX_RxDMA_DESCRIPTOR_HI;
        !          1663:        sdla_bus_read_4(card->hw, dma_descr, &reg);
        !          1664:
        !          1665:        if (bit_test((u_int8_t *)&reg, RxDMA_HI_DMA_GO_READY_BIT)) {
        !          1666:                log(LOG_INFO, "%s: Error: RxDMA GO Ready bit set on dma Rx\n",
        !          1667:                                card->devname);
        !          1668:                return (EFAULT);
        !          1669:        }
        !          1670: #endif
        !          1671:
        !          1672:        if (sc->rx_dma_buf) {
        !          1673:                log(LOG_INFO, "%s: Critial Error: Rx Dma Buf busy!\n",
        !          1674:                    sc->if_name);
        !          1675:                return (EINVAL);
        !          1676:        }
        !          1677:
        !          1678:        sc->rx_dma_buf = SIMPLEQ_FIRST(&sc->wp_rx_free_list);
        !          1679:
        !          1680:        if (sc->rx_dma_buf == NULL) {
        !          1681:                if (aft_alloc_rx_dma_buff(sc, 1) == 0) {
        !          1682:                        log(LOG_INFO, "%s: Critical Error no rx dma buf!",
        !          1683:                            sc->if_name);
        !          1684:                        return (ENOMEM);
        !          1685:                }
        !          1686:                sc->rx_dma_buf = SIMPLEQ_FIRST(&sc->wp_rx_free_list);
        !          1687:        }
        !          1688:
        !          1689:        SIMPLEQ_REMOVE_HEAD(&sc->wp_rx_free_list, entry);
        !          1690:
        !          1691:        bus_dmamap_sync(sc->dmatag, sc->rx_dma_buf->dma_map, 0, sc->dma_mtu,
        !          1692:              BUS_DMASYNC_PREREAD);
        !          1693:
        !          1694:        rx_el = &sc->rx_dma_buf->rx_el;
        !          1695:        memset(rx_el, 0, sizeof(*rx_el));
        !          1696:
        !          1697:        bus_addr = sc->rx_dma_buf->dma_map->dm_segs[0].ds_addr;
        !          1698:        rx_el->dma_addr = bus_addr;
        !          1699:
        !          1700:        /* Write the pointer of the data packet to the
        !          1701:         * DMA address register */
        !          1702:        reg = bus_addr;
        !          1703:
        !          1704:        /* Set the 32bit alignment of the data length.
        !          1705:         * Since we are setting up for rx, set this value
        !          1706:         * to Zero */
        !          1707:        reg &= ~(RxDMA_LO_ALIGNMENT_BIT_MASK);
        !          1708:
        !          1709:        dma_descr = (sc->logic_ch_num<<4) + XILINX_RxDMA_DESCRIPTOR_LO;
        !          1710:
        !          1711: #ifdef DEBUG_RX
        !          1712:        log(LOG_INFO, "%s: RxDMA_LO = 0x%X, BusAddr=0x%lX "
        !          1713:            "DmaDescr=0x%lX (%s)\n", card->devname, reg, bus_addr,
        !          1714:            dma_descr, __FUNCTION__);
        !          1715: #endif
        !          1716:        sdla_bus_write_4(card->hw, dma_descr, reg);
        !          1717:
        !          1718:        dma_descr=(unsigned long)(sc->logic_ch_num << 4) +
        !          1719:            XILINX_RxDMA_DESCRIPTOR_HI;
        !          1720:
        !          1721:        reg = 0;
        !          1722:
        !          1723:        reg |= (sc->dma_mtu >> 2) & RxDMA_HI_DMA_DATA_LENGTH_MASK;
        !          1724:
        !          1725: #ifdef TRUE_FIFO_SIZE
        !          1726:        reg |= (sc->fifo_size_code & DMA_FIFO_SIZE_MASK) <<
        !          1727:            DMA_FIFO_SIZE_SHIFT;
        !          1728: #else
        !          1729:
        !          1730:        reg |= (HARD_FIFO_CODE & DMA_FIFO_SIZE_MASK) << DMA_FIFO_SIZE_SHIFT;
        !          1731: #endif
        !          1732:        reg |= (sc->fifo_base_addr&DMA_FIFO_BASE_ADDR_MASK) <<
        !          1733:            DMA_FIFO_BASE_ADDR_SHIFT;
        !          1734:
        !          1735:        bit_set((u_int8_t *)&reg, RxDMA_HI_DMA_GO_READY_BIT);
        !          1736:
        !          1737: #ifdef DEBUG_RX
        !          1738:        log(LOG_INFO, "%s: RXDMA_HI = 0x%X, BusAddr=0x%lX DmaDescr=0x%lX "
        !          1739:            "(%s)\n", sc->if_name, reg, bus_addr, dma_descr, __FUNCTION__);
        !          1740: #endif
        !          1741:
        !          1742:        sdla_bus_write_4(card->hw, dma_descr, reg);
        !          1743:
        !          1744:        bit_set((u_int8_t *)&sc->rx_dma, 0);
        !          1745:
        !          1746:        return (0);
        !          1747: }
        !          1748:
        !          1749:
        !          1750: static int
        !          1751: xilinx_dma_tx(sdla_t *card, xilinx_softc_t *sc)
        !          1752: {
        !          1753:        u_int32_t reg = 0;
        !          1754:        struct mbuf *m;
        !          1755:        unsigned long dma_descr;
        !          1756:        unsigned char len_align = 0;
        !          1757:        int len = 0;
        !          1758:
        !          1759: #ifdef DEBUG_TX
        !          1760:        log(LOG_INFO, "------ Setup Tx DMA descriptor. --\n");
        !          1761: #endif
        !          1762:
        !          1763:        if (bit_test((u_int8_t *)&sc->dma_status, TX_BUSY)) {
        !          1764: #ifdef DEBUG_TX
        !          1765:                log(LOG_INFO, "%s:  TX_BUSY set (%s:%d)!\n",
        !          1766:                    sc->if_name, __FUNCTION__, __LINE__);
        !          1767: #endif
        !          1768:                return EBUSY;
        !          1769:        }
        !          1770:        bit_set((u_int8_t *)&sc->dma_status, TX_BUSY);
        !          1771:
        !          1772:
        !          1773:        /*
        !          1774:         * Free the previously skb dma mapping.
        !          1775:         * In this case the tx interrupt didn't finish and we must re-transmit.
        !          1776:         */
        !          1777:        if (sc->tx_dma_addr && sc->tx_dma_len) {
        !          1778:                log(LOG_INFO, "%s: Unmaping tx_dma_addr in %s\n",
        !          1779:                    sc->if_name, __FUNCTION__);
        !          1780:
        !          1781:                sc->tx_dma_addr = 0;
        !          1782:                sc->tx_dma_len = 0;
        !          1783:        }
        !          1784:
        !          1785:        /* Free the previously sent tx packet. To
        !          1786:         * minimize tx isr, the previously transmitted
        !          1787:         * packet is deallocated here */
        !          1788:        if (sc->tx_dma_mbuf) {
        !          1789:                bus_dmamap_unload(sc->dmatag, sc->tx_dmamap);
        !          1790:                m_freem(sc->tx_dma_mbuf);
        !          1791:                sc->tx_dma_mbuf = NULL;
        !          1792:        }
        !          1793:
        !          1794:        /* check queue pointers before starting transmission */
        !          1795:
        !          1796:        /* sanity check: make sure that DMA is in ready state */
        !          1797:        dma_descr = (sc->logic_ch_num << 4) + XILINX_TxDMA_DESCRIPTOR_HI;
        !          1798:
        !          1799: #ifdef DEBUG_TX
        !          1800:        log(LOG_INFO, "%s: sc logic ch=%ld dma_descr=0x%lx set (%s:%d)!\n",
        !          1801:            sc->if_name, sc->logic_ch_num, dma_descr, __FUNCTION__, __LINE__);
        !          1802: #endif
        !          1803:
        !          1804:        sdla_bus_read_4(card->hw, dma_descr, &reg);
        !          1805:
        !          1806:        if (bit_test((u_int8_t *)&reg, TxDMA_HI_DMA_GO_READY_BIT)) {
        !          1807:                log(LOG_INFO, "%s: Error: TxDMA GO Ready bit set "
        !          1808:                    "on dma Tx 0x%X\n", card->devname, reg);
        !          1809:                bit_clear((u_int8_t *)&sc->dma_status, TX_BUSY);
        !          1810:                return (EFAULT);
        !          1811:        }
        !          1812:
        !          1813:        IF_DEQUEUE(&sc->wp_tx_pending_list, m);
        !          1814:
        !          1815:        if (!m) {
        !          1816:                bit_clear((u_int8_t *)&sc->dma_status, TX_BUSY);
        !          1817:                return (ENOBUFS);
        !          1818:        }
        !          1819:
        !          1820:        len = m->m_len;
        !          1821:        if (len > MAX_XILINX_TX_DMA_SIZE) {
        !          1822:                /* FIXME: We need to split this frame into
        !          1823:                 *        multiple parts.  For now though
        !          1824:                 *        just drop it :) */
        !          1825:                log(LOG_INFO, "%s: Tx len %d > %d (MAX TX DMA LEN)\n",
        !          1826:                    sc->if_name, len, MAX_XILINX_TX_DMA_SIZE);
        !          1827:                m_freem(m);
        !          1828:                bit_clear((u_int8_t *)&sc->dma_status, TX_BUSY);
        !          1829:                return (EINVAL);
        !          1830:        }
        !          1831:
        !          1832:        if (ADDR_MASK(mtod(m, caddr_t), 0x03)) {
        !          1833:                /* The mbuf should already be aligned */
        !          1834:                log(LOG_INFO, "%s: TX packet not aligned!\n",
        !          1835:                    sc->if_name);
        !          1836:                m_freem(m);
        !          1837:                bit_clear((u_int8_t *)&sc->dma_status, TX_BUSY);
        !          1838:                return (EINVAL);
        !          1839:        }
        !          1840:
        !          1841:        if (bus_dmamap_load(sc->dmatag, sc->tx_dmamap,
        !          1842:            mtod(m, void *), len, NULL, BUS_DMA_NOWAIT | BUS_DMA_WRITE)) {
        !          1843:                log(LOG_INFO, "%s: Failed to load TX mbuf for DMA!\n",
        !          1844:                    sc->if_name);
        !          1845:                m_freem(m);
        !          1846:                bit_clear((u_int8_t *)&sc->dma_status, TX_BUSY);
        !          1847:                return (EINVAL);
        !          1848:        }
        !          1849:
        !          1850:        sc->tx_dma_addr = sc->tx_dmamap->dm_segs[0].ds_addr;
        !          1851:        sc->tx_dma_len = len;
        !          1852:
        !          1853:        if (sc->tx_dma_addr & 0x03) {
        !          1854:                log(LOG_INFO, "%s: Error: Tx Ptr not aligned "
        !          1855:                    "to 32bit boundary!\n", card->devname);
        !          1856:                m_freem(m);
        !          1857:                bit_clear((u_int8_t *)&sc->dma_status, TX_BUSY);
        !          1858:                return (EINVAL);
        !          1859:        }
        !          1860:
        !          1861:        sc->tx_dma_mbuf = m;
        !          1862:
        !          1863:        /* WARNING: Do not use the "skb" pointer from
        !          1864:         *          here on.  The skb pointer might not exist if
        !          1865:         *          we are in transparent mode */
        !          1866:
        !          1867:        dma_descr = (sc->logic_ch_num << 4) + XILINX_TxDMA_DESCRIPTOR_LO;
        !          1868:
        !          1869:        /* Write the pointer of the data packet to the
        !          1870:         * DMA address register */
        !          1871:        reg = sc->tx_dma_addr;
        !          1872:
        !          1873:        bus_dmamap_sync(sc->dmatag, sc->tx_dmamap, 0, len,
        !          1874:            BUS_DMASYNC_PREWRITE);
        !          1875:
        !          1876:        /* Set the 32bit alignment of the data length.
        !          1877:         * Used to pad the tx packet to the 32 bit
        !          1878:         * boundary */
        !          1879:        reg &= ~(TxDMA_LO_ALIGNMENT_BIT_MASK);
        !          1880:        reg |= (len & 0x03);
        !          1881:
        !          1882:        if (len & 0x03)
        !          1883:                len_align = 1;
        !          1884:
        !          1885: #ifdef DEBUG_TX
        !          1886:        log(LOG_INFO, "%s: TXDMA_LO=0x%X PhyAddr=0x%lX DmaDescr=0x%lX (%s)\n",
        !          1887:                sc->if_name, reg, sc->tx_dma_addr, dma_descr, __FUNCTION__);
        !          1888: #endif
        !          1889:
        !          1890:        sdla_bus_write_4(card->hw, dma_descr, reg);
        !          1891:
        !          1892:        dma_descr = (sc->logic_ch_num << 4) + XILINX_TxDMA_DESCRIPTOR_HI;
        !          1893:
        !          1894:        reg = 0;
        !          1895:        reg |= (((len >> 2) + len_align) & TxDMA_HI_DMA_DATA_LENGTH_MASK);
        !          1896:
        !          1897: #ifdef TRUE_FIFO_SIZE
        !          1898:        reg |= (sc->fifo_size_code & DMA_FIFO_SIZE_MASK) <<
        !          1899:            DMA_FIFO_SIZE_SHIFT;
        !          1900: #else
        !          1901:
        !          1902:        reg |= (HARD_FIFO_CODE & DMA_FIFO_SIZE_MASK) << DMA_FIFO_SIZE_SHIFT;
        !          1903: #endif
        !          1904:        reg |= (sc->fifo_base_addr & DMA_FIFO_BASE_ADDR_MASK) <<
        !          1905:            DMA_FIFO_BASE_ADDR_SHIFT;
        !          1906:
        !          1907:        /*
        !          1908:         * Only enable the Frame Start/Stop on
        !          1909:         * non-transparent hdlc configuration
        !          1910:         */
        !          1911:        bit_set((u_int8_t *)&reg, TxDMA_HI_DMA_FRAME_START_BIT);
        !          1912:        bit_set((u_int8_t *)&reg, TxDMA_HI_DMA_FRAME_END_BIT);
        !          1913:
        !          1914:        bit_set((u_int8_t *)&reg, TxDMA_HI_DMA_GO_READY_BIT);
        !          1915:
        !          1916: #ifdef DEBUG_TX
        !          1917:        log(LOG_INFO, "%s: TXDMA_HI=0x%X DmaDescr=0x%lX (%s)\n",
        !          1918:            sc->if_name, reg, dma_descr, __FUNCTION__);
        !          1919: #endif
        !          1920:
        !          1921:        sdla_bus_write_4(card->hw, dma_descr, reg);
        !          1922:
        !          1923:        return (0);
        !          1924:
        !          1925: }
        !          1926:
        !          1927: static void
        !          1928: xilinx_dma_tx_complete(sdla_t *card, xilinx_softc_t *sc)
        !          1929: {
        !          1930:        u_int32_t reg = 0;
        !          1931:        unsigned long dma_descr;
        !          1932:
        !          1933: #ifdef DEBUG_TX
        !          1934:        log(LOG_INFO, "%s: TX DMA complete\n", card->devname);
        !          1935: #endif
        !          1936:        /* DEBUGTX */
        !          1937: /*     sdla_bus_read_4(card->hw, 0x78, &tmp1); */
        !          1938:
        !          1939:        dma_descr = (sc->logic_ch_num << 4) + XILINX_TxDMA_DESCRIPTOR_HI;
        !          1940:        sdla_bus_read_4(card->hw, dma_descr, &reg);
        !          1941:
        !          1942:        if (sc->tx_dma_mbuf == NULL) {
        !          1943:                log(LOG_INFO,
        !          1944:                    "%s: Critical Error: Tx DMA intr: no tx mbuf !\n",
        !          1945:                    card->devname);
        !          1946:                bit_clear((u_int8_t *)&sc->dma_status, TX_BUSY);
        !          1947:                return;
        !          1948:        }
        !          1949:
        !          1950:        bus_dmamap_sync(sc->dmatag, sc->tx_dmamap, 0, sc->tx_dma_len,
        !          1951:              BUS_DMASYNC_POSTWRITE);
        !          1952:
        !          1953:        sc->tx_dma_addr = 0;
        !          1954:        sc->tx_dma_len = 0;
        !          1955:
        !          1956:        /* Do not free the packet here,
        !          1957:         * copy the packet dma info into csum
        !          1958:         * field and let the bh handler analyze
        !          1959:         * the transmitted packet.
        !          1960:         */
        !          1961:
        !          1962:        if (reg & TxDMA_HI_DMA_PCI_ERROR_RETRY_TOUT) {
        !          1963:                log(LOG_INFO, "%s:%s: PCI Error: 'Retry' "
        !          1964:                    "exceeds maximum (64k): Reg=0x%X!\n",
        !          1965:                    card->devname, sc->if_name, reg);
        !          1966:
        !          1967:                if (++sc->pci_retry < 3) {
        !          1968:                        bit_set((u_int8_t *)&reg,
        !          1969:                                TxDMA_HI_DMA_GO_READY_BIT);
        !          1970:
        !          1971:                        log(LOG_INFO, "%s: Retry: TXDMA_HI=0x%X "
        !          1972:                            "DmaDescr=0x%lX (%s)\n",
        !          1973:                            sc->if_name, reg, dma_descr, __FUNCTION__);
        !          1974:
        !          1975:                        sdla_bus_write_4(card->hw, dma_descr, reg);
        !          1976:                        return;
        !          1977:                }
        !          1978:        }
        !          1979:
        !          1980:        sc->pci_retry = 0;
        !          1981:        sc->tx_dma_mbuf->m_pkthdr.csum_flags = reg;
        !          1982:        IF_ENQUEUE(&sc->wp_tx_complete_list, sc->tx_dma_mbuf);
        !          1983:        sc->tx_dma_mbuf = NULL;
        !          1984:
        !          1985:        bit_clear((u_int8_t *)&sc->dma_status, TX_BUSY);
        !          1986:
        !          1987:        xilinx_process_packet(sc);
        !          1988: }
        !          1989:
        !          1990: static void
        !          1991: xilinx_tx_post_complete(sdla_t *card, xilinx_softc_t *sc, struct mbuf *m)
        !          1992: {
        !          1993:        struct ifnet    *ifp;
        !          1994:        unsigned long   reg = m->m_pkthdr.csum_flags;
        !          1995:
        !          1996:        WAN_ASSERT1(sc == NULL);
        !          1997:        ifp = (struct ifnet *)&sc->common.ifp;
        !          1998:        if ((bit_test((u_int8_t *)&reg, TxDMA_HI_DMA_GO_READY_BIT)) ||
        !          1999:            (reg & TxDMA_HI_DMA_DATA_LENGTH_MASK) ||
        !          2000:            (reg & TxDMA_HI_DMA_PCI_ERROR_MASK)) {
        !          2001:
        !          2002: #ifdef DEBUG_TX
        !          2003:                log(LOG_INFO, "%s:%s: Tx DMA Descriptor=0x%lX\n",
        !          2004:                        card->devname, sc->if_name, reg);
        !          2005: #endif
        !          2006:
        !          2007:                /* Checking Tx DMA Go bit. Has to be '0' */
        !          2008:                if (bit_test((u_int8_t *)&reg, TxDMA_HI_DMA_GO_READY_BIT))
        !          2009:                        log(LOG_INFO, "%s:%s: Error: TxDMA Intr: "
        !          2010:                            "GO bit set on Tx intr\n",
        !          2011:                            card->devname, sc->if_name);
        !          2012:
        !          2013:                if (reg & TxDMA_HI_DMA_DATA_LENGTH_MASK)
        !          2014:                        log(LOG_INFO, "%s:%s: Error: TxDMA Length "
        !          2015:                        "not equal 0 \n", card->devname, sc->if_name);
        !          2016:
        !          2017:                /* Checking Tx DMA PCI error status. Has to be '0's */
        !          2018:                if (reg & TxDMA_HI_DMA_PCI_ERROR_MASK) {
        !          2019:
        !          2020:                        if (reg & TxDMA_HI_DMA_PCI_ERROR_M_ABRT)
        !          2021:                                log(LOG_INFO, "%s:%s: Tx Error: "
        !          2022:                                    "Abort from Master: pci fatal error!\n",
        !          2023:                                    card->devname, sc->if_name);
        !          2024:
        !          2025:                        if (reg & TxDMA_HI_DMA_PCI_ERROR_T_ABRT)
        !          2026:                                log(LOG_INFO, "%s:%s: Tx Error: "
        !          2027:                                    "Abort from Target: pci fatal error!\n",
        !          2028:                                    card->devname, sc->if_name);
        !          2029:
        !          2030:                        if (reg & TxDMA_HI_DMA_PCI_ERROR_DS_TOUT) {
        !          2031:                                log(LOG_INFO, "%s:%s: Tx Warning: "
        !          2032:                                    "PCI Latency Timeout!\n",
        !          2033:                                    card->devname, sc->if_name);
        !          2034:                                goto tx_post_ok;
        !          2035:                        }
        !          2036:                        if (reg & TxDMA_HI_DMA_PCI_ERROR_RETRY_TOUT)
        !          2037:                                log(LOG_INFO, "%s:%s: Tx Error: 'Retry' "
        !          2038:                                    "exceeds maximum (64k): pci fatal error!\n",
        !          2039:                                    card->devname, sc->if_name);
        !          2040:                }
        !          2041:                goto tx_post_exit;
        !          2042:        }
        !          2043:
        !          2044: tx_post_ok:
        !          2045:
        !          2046:        if (ifp)
        !          2047:                ifp->if_opackets++;
        !          2048:
        !          2049:        /* Indicate that the first tx frame went
        !          2050:         * out on the transparent link */
        !          2051:        bit_set((u_int8_t *)&sc->idle_start, 0);
        !          2052:
        !          2053: tx_post_exit:
        !          2054:
        !          2055:        if (!xilinx_dma_tx(card, sc)) {
        !          2056:                /*
        !          2057:                 * If we were able to transmit and the interface is set to
        !          2058:                 * OACTIVE remove this flag and let kernel try to transmit.
        !          2059:                 */
        !          2060:                if (ifp->if_flags & IFF_OACTIVE)
        !          2061:                        ifp->if_flags &= ~IFF_OACTIVE;
        !          2062:        }
        !          2063:        return;
        !          2064: }
        !          2065:
        !          2066: static void
        !          2067: xilinx_dma_rx_complete(sdla_t *card, xilinx_softc_t *sc)
        !          2068: {
        !          2069:        struct xilinx_rx_buffer *buf;
        !          2070:        unsigned long dma_descr;
        !          2071:        wp_rx_element_t *rx_el;
        !          2072:
        !          2073:        bit_clear((u_int8_t *)&sc->rx_dma, 0);
        !          2074:
        !          2075:        if (sc->rx_dma_buf == NULL) {
        !          2076:                log(LOG_INFO,
        !          2077:                    "%s: Critical Error: rx_dma_mbuf\n", sc->if_name);
        !          2078:                return;
        !          2079:        }
        !          2080:
        !          2081:        rx_el = &sc->rx_dma_buf->rx_el;
        !          2082:
        !          2083:        /* Reading Rx DMA descriptor information */
        !          2084:        dma_descr=(sc->logic_ch_num << 4) + XILINX_RxDMA_DESCRIPTOR_LO;
        !          2085:        sdla_bus_read_4(card->hw, dma_descr, &rx_el->align);
        !          2086:        rx_el->align &= RxDMA_LO_ALIGNMENT_BIT_MASK;
        !          2087:
        !          2088:        dma_descr = (sc->logic_ch_num << 4) + XILINX_RxDMA_DESCRIPTOR_HI;
        !          2089:        sdla_bus_read_4(card->hw, dma_descr, &rx_el->reg);
        !          2090:
        !          2091:        rx_el->pkt_error = sc->pkt_error;
        !          2092:        sc->pkt_error = 0;
        !          2093:
        !          2094: #ifdef DEBUG_RX
        !          2095:        log(LOG_INFO, "%s: RX HI=0x%X  LO=0x%X DMA=0x%lX (%s:%d)\n",
        !          2096:            sc->if_name, rx_el->reg, rx_el->align, rx_el->dma_addr,
        !          2097:            __FUNCTION__, __LINE__);
        !          2098: #endif
        !          2099:
        !          2100:        buf = sc->rx_dma_buf;
        !          2101:        sc->rx_dma_buf = NULL;
        !          2102:
        !          2103:        xilinx_dma_rx(card, sc);
        !          2104:
        !          2105:        SIMPLEQ_INSERT_TAIL(&sc->wp_rx_complete_list, buf, entry);
        !          2106:
        !          2107:        xilinx_process_packet(sc);
        !          2108:
        !          2109: /*     sdla_bus_read_4(card->hw, 0x80, &rx_empty); */
        !          2110: }
        !          2111:
        !          2112:
        !          2113: static void
        !          2114: xilinx_rx_post_complete(sdla_t *card, xilinx_softc_t *sc,
        !          2115:     struct xilinx_rx_buffer *buf, struct mbuf **new_m, u_char *pkt_error)
        !          2116: {
        !          2117:        struct ifnet    *ifp;
        !          2118:        unsigned int len, data_error = 0;
        !          2119:        wp_rx_element_t *rx_el = &buf->rx_el;
        !          2120:        struct mbuf *m = buf->mbuf;
        !          2121:
        !          2122:        WAN_ASSERT1(sc == NULL);
        !          2123:        ifp = (struct ifnet *)&sc->common.ifp;  /*m->m_pkthdr.rcvif;*/
        !          2124:
        !          2125: #ifdef DEBUG_RX
        !          2126:        log(LOG_INFO, "%s: RX HI=0x%X  LO=0x%X DMA=0x%lX (%s:%d)\n",
        !          2127:            sc->if_name, rx_el->reg, rx_el->align, rx_el->dma_addr,
        !          2128:            __FUNCTION__, __LINE__);
        !          2129: #endif
        !          2130:        rx_el->align &= RxDMA_LO_ALIGNMENT_BIT_MASK;
        !          2131:        *pkt_error = 0;
        !          2132:        *new_m = NULL;
        !          2133:
        !          2134:
        !          2135:        /* Checking Rx DMA Go bit. Has to be '0' */
        !          2136:        if (bit_test((u_int8_t *)&rx_el->reg, RxDMA_HI_DMA_GO_READY_BIT)) {
        !          2137:                log(LOG_INFO, "%s: Error: RxDMA Intr: GO bit set on Rx intr\n",
        !          2138:                    card->devname);
        !          2139:                ifp->if_ierrors++;
        !          2140:                goto rx_comp_error;
        !          2141:        }
        !          2142:
        !          2143:        /* Checking Rx DMA PCI error status. Has to be '0's */
        !          2144:        if (rx_el->reg & RxDMA_HI_DMA_PCI_ERROR_MASK) {
        !          2145: #ifdef DEBUG_ERR
        !          2146:                if (rx_el->reg & RxDMA_HI_DMA_PCI_ERROR_M_ABRT)
        !          2147:                        log(LOG_INFO, "%s: Rx Error: Abort from Master: "
        !          2148:                            "pci fatal error!\n", card->devname);
        !          2149:
        !          2150:                if (rx_el->reg & RxDMA_HI_DMA_PCI_ERROR_T_ABRT)
        !          2151:                        log(LOG_INFO, "%s: Rx Error: Abort from Target: "
        !          2152:                            "pci fatal error!\n", card->devname);
        !          2153:
        !          2154:                if (rx_el->reg & RxDMA_HI_DMA_PCI_ERROR_DS_TOUT)
        !          2155:                        log(LOG_INFO, "%s: Rx Error: No 'DeviceSelect' "
        !          2156:                            "from target: pci fatal error!\n", card->devname);
        !          2157:
        !          2158:                if (rx_el->reg & RxDMA_HI_DMA_PCI_ERROR_RETRY_TOUT)
        !          2159:                        log(LOG_INFO, "%s: Rx Error: 'Retry' exceeds maximum "
        !          2160:                            "(64k): pci fatal error!\n", card->devname);
        !          2161:
        !          2162:                log(LOG_INFO, "%s: RXDMA PCI ERROR = 0x%x\n",
        !          2163:                    card->devname, rx_el->reg);
        !          2164: #endif
        !          2165:                if (ifp)
        !          2166:                        ifp->if_ierrors++;
        !          2167:
        !          2168:                goto rx_comp_error;
        !          2169:        }
        !          2170:
        !          2171:        /* Checking Rx DMA Frame start bit. (information for api) */
        !          2172:        if (!bit_test((u_int8_t *)&rx_el->reg, RxDMA_HI_DMA_FRAME_START_BIT)) {
        !          2173: #ifdef DEBUG_ERR
        !          2174:                log(LOG_INFO, "%s: RxDMA Intr: Start flag missing: "
        !          2175:                    "MTU Mismatch! Reg=0x%X\n", card->devname, rx_el->reg);
        !          2176: #endif
        !          2177:                if (ifp)
        !          2178:                        ifp->if_ierrors++;
        !          2179:                goto rx_comp_error;
        !          2180:        }
        !          2181:
        !          2182:        /* Checking Rx DMA Frame end bit. (information for api) */
        !          2183:        if (!bit_test((u_int8_t *)&rx_el->reg, RxDMA_HI_DMA_FRAME_END_BIT)) {
        !          2184: #ifdef DEBUG_ERR
        !          2185:                log(LOG_INFO, "%s: RxDMA Intr: End flag missing: "
        !          2186:                    "MTU Mismatch! Reg=0x%X\n", card->devname, rx_el->reg);
        !          2187: #endif
        !          2188:                if (ifp)
        !          2189:                        ifp->if_ierrors++;
        !          2190:                goto rx_comp_error;
        !          2191:
        !          2192:        } else {  /* Check CRC error flag only if this is the end of Frame */
        !          2193:
        !          2194:                if (bit_test((u_int8_t *)&rx_el->reg,
        !          2195:                    RxDMA_HI_DMA_CRC_ERROR_BIT)) {
        !          2196: #ifdef DEBUG_ERR
        !          2197:                        log(LOG_INFO, "%s: RxDMA Intr: CRC Error! Reg=0x%X\n",
        !          2198:                            card->devname, rx_el->reg);
        !          2199: #endif
        !          2200:                        if (ifp)
        !          2201:                                ifp->if_ierrors++;
        !          2202:
        !          2203:                        bit_set((u_int8_t *)&rx_el->pkt_error,
        !          2204:                            WP_CRC_ERROR_BIT);
        !          2205:                        data_error = 1;
        !          2206:                }
        !          2207:
        !          2208:                /* Check if this frame is an abort, if it is
        !          2209:                 * drop it and continue receiving */
        !          2210:                if (bit_test((u_int8_t *)&rx_el->reg,
        !          2211:                    RxDMA_HI_DMA_FRAME_ABORT_BIT)) {
        !          2212: #ifdef DEBUG_ERR
        !          2213:                        log(LOG_INFO, "%s: RxDMA Intr: Abort! Reg=0x%X\n",
        !          2214:                            card->devname, rx_el->reg);
        !          2215: #endif
        !          2216:                        if (ifp)
        !          2217:                            ifp->if_ierrors++;
        !          2218:
        !          2219:                        bit_set((u_int8_t *)&rx_el->pkt_error,
        !          2220:                            WP_ABORT_ERROR_BIT);
        !          2221:                        data_error = 1;
        !          2222:                }
        !          2223:
        !          2224:                if (data_error)
        !          2225:                        goto rx_comp_error;
        !          2226:        }
        !          2227:
        !          2228:        len = rx_el->reg & RxDMA_HI_DMA_DATA_LENGTH_MASK;
        !          2229:
        !          2230:        /* In HDLC mode, calculate rx length based
        !          2231:         * on alignment value, received from DMA */
        !          2232:        len = (((sc->dma_mtu >> 2) - len) << 2) -
        !          2233:            (~(rx_el->align) & RxDMA_LO_ALIGNMENT_BIT_MASK);
        !          2234:
        !          2235:        *pkt_error = rx_el->pkt_error;
        !          2236:
        !          2237:        /* After a RX FIFO overflow, we must mark max 7
        !          2238:         * subsequent frames since firmware, cannot
        !          2239:         * guarantee the contents of the fifo */
        !          2240:
        !          2241:        if (bit_test((u_int8_t *)&rx_el->pkt_error, WP_FIFO_ERROR_BIT)) {
        !          2242:                if (++sc->rx_fifo_err_cnt >= WP_MAX_FIFO_FRAMES) {
        !          2243:                        sc->rx_fifo_err_cnt = 0;
        !          2244:                }
        !          2245:                bit_set((u_int8_t *)pkt_error, WP_FIFO_ERROR_BIT);
        !          2246:        } else {
        !          2247:                if (sc->rx_fifo_err_cnt) {
        !          2248:                        if (++sc->rx_fifo_err_cnt >= WP_MAX_FIFO_FRAMES) {
        !          2249:                                sc->rx_fifo_err_cnt = 0;
        !          2250:                        }
        !          2251:                        bit_set((u_int8_t *)pkt_error, WP_FIFO_ERROR_BIT);
        !          2252:                }
        !          2253:        }
        !          2254:
        !          2255:        bus_dmamap_sync(sc->dmatag, sc->rx_dma_buf->dma_map, 0, len,
        !          2256:              BUS_DMASYNC_POSTREAD);
        !          2257:
        !          2258:        m->m_len = m->m_pkthdr.len = len;
        !          2259:
        !          2260:        if (len > aft_rx_copyback) {
        !          2261:                /* The rx size is big enough, thus
        !          2262:                 * send this buffer up the stack
        !          2263:                 * and allocate another one */
        !          2264:                *new_m = m;
        !          2265:                buf->mbuf = NULL;
        !          2266:        } else {
        !          2267:                struct mbuf *m0;
        !          2268:                /* The rx packet is very
        !          2269:                 * small thus, allocate a new
        !          2270:                 * buffer and pass it up */
        !          2271:                if ((m0 = m_copym2(m, 0, len, M_NOWAIT)) == NULL) {
        !          2272:                        log(LOG_INFO, "%s: Failed to allocate mbuf!\n",
        !          2273:                            sc->if_name);
        !          2274:                        if (ifp)
        !          2275:                            ifp->if_ierrors++;
        !          2276:                } else
        !          2277:                        *new_m = m0;
        !          2278:        }
        !          2279:
        !          2280:  rx_comp_error:
        !          2281:        aft_reload_rx_dma_buff(sc, buf);
        !          2282:
        !          2283:        return;
        !          2284: }
        !          2285:
        !          2286:
        !          2287: static char
        !          2288: request_xilinx_logical_channel_num(sdla_t *card, xilinx_softc_t *sc,
        !          2289:     long *free_ch)
        !          2290: {
        !          2291:        char logic_ch = -1, free_logic_ch = -1;
        !          2292:        int i, err;
        !          2293:
        !          2294:        *free_ch = -1;
        !          2295:
        !          2296: #ifdef DEBUG_INIT
        !          2297:        log(LOG_INFO, "-- Request_Xilinx_logic_channel_num:--\n");
        !          2298:        log(LOG_INFO, "%s: Global Num Timeslots=%d  "
        !          2299:            "Global Logic ch Map 0x%lX (%s:%d)\n",
        !          2300:            sc->if_name, card->u.xilinx.num_of_time_slots,
        !          2301:            card->u.xilinx.logic_ch_map, __FUNCTION__, __LINE__);
        !          2302: #endif
        !          2303:
        !          2304:        err = request_fifo_baddr_and_size(card, sc);
        !          2305:        if (err)
        !          2306:                return (-1);
        !          2307:
        !          2308:        for (i = 0; i < card->u.xilinx.num_of_time_slots; i++) {
        !          2309:                if (!bit_test((u_int8_t *)&card->u.xilinx.logic_ch_map, i)) {
        !          2310:                        bit_set((u_int8_t *)&card->u.xilinx.logic_ch_map, i);
        !          2311:                        logic_ch = i;
        !          2312:                        break;
        !          2313:                }
        !          2314:        }
        !          2315:
        !          2316:        if (logic_ch == -1)
        !          2317:                return (logic_ch);
        !          2318:
        !          2319:        for (i = 0; i < card->u.xilinx.num_of_time_slots; i++) {
        !          2320:                if (!bit_test((u_int8_t *)&card->u.xilinx.logic_ch_map, i)) {
        !          2321:                        free_logic_ch = HDLC_FREE_LOGIC_CH;
        !          2322:                        break;
        !          2323:                }
        !          2324:        }
        !          2325:
        !          2326:        if (card->u.xilinx.dev_to_ch_map[(unsigned char)logic_ch]) {
        !          2327:                log(LOG_INFO, "%s: Error, request logical ch=%d map busy\n",
        !          2328:                    card->devname, logic_ch);
        !          2329:                return (-1);
        !          2330:        }
        !          2331:
        !          2332:        *free_ch = free_logic_ch;
        !          2333:
        !          2334:        card->u.xilinx.dev_to_ch_map[(unsigned char)logic_ch] = (void *)sc;
        !          2335:
        !          2336:        if (logic_ch > card->u.xilinx.top_logic_ch) {
        !          2337:                card->u.xilinx.top_logic_ch = logic_ch;
        !          2338:                xilinx_dma_max_logic_ch(card);
        !          2339:        }
        !          2340:
        !          2341:        return (logic_ch);
        !          2342: }
        !          2343:
        !          2344: static void
        !          2345: free_xilinx_logical_channel_num(sdla_t *card, int logic_ch)
        !          2346: {
        !          2347:        bit_clear((u_int8_t *)&card->u.xilinx.logic_ch_map, logic_ch);
        !          2348:        card->u.xilinx.dev_to_ch_map[logic_ch] = NULL;
        !          2349:
        !          2350:        if (logic_ch >= card->u.xilinx.top_logic_ch) {
        !          2351:                int i;
        !          2352:
        !          2353:                card->u.xilinx.top_logic_ch = XILINX_DEFLT_ACTIVE_CH;
        !          2354:
        !          2355:                for (i = 0; i < card->u.xilinx.num_of_time_slots; i++) {
        !          2356:                        if (card->u.xilinx.dev_to_ch_map[logic_ch])
        !          2357:                                card->u.xilinx.top_logic_ch = i;
        !          2358:                }
        !          2359:
        !          2360:                xilinx_dma_max_logic_ch(card);
        !          2361:        }
        !          2362:
        !          2363: }
        !          2364:
        !          2365: static void
        !          2366: xilinx_dma_max_logic_ch(sdla_t *card)
        !          2367: {
        !          2368:        u_int32_t reg;
        !          2369:
        !          2370: #ifdef DEBUG_INIT
        !          2371:        log(LOG_INFO, "-- Xilinx_dma_max_logic_ch :--\n");
        !          2372: #endif
        !          2373:
        !          2374:        sdla_bus_read_4(card->hw, XILINX_DMA_CONTROL_REG, &reg);
        !          2375:
        !          2376:        /* Set up the current highest active logic channel */
        !          2377:
        !          2378:        reg &= DMA_ACTIVE_CHANNEL_BIT_MASK;
        !          2379:        reg |= (card->u.xilinx.top_logic_ch << DMA_ACTIVE_CHANNEL_BIT_SHIFT);
        !          2380:
        !          2381:        sdla_bus_write_4(card->hw, XILINX_DMA_CONTROL_REG, reg);
        !          2382: }
        !          2383:
        !          2384: static int
        !          2385: aft_alloc_rx_buffers(xilinx_softc_t *sc)
        !          2386: {
        !          2387:        struct xilinx_rx_buffer *buf;
        !          2388:
        !          2389:        SIMPLEQ_INIT(&sc->wp_rx_free_list);
        !          2390:        SIMPLEQ_INIT(&sc->wp_rx_complete_list);
        !          2391:
        !          2392:        /* allocate receive buffers in one cluster */
        !          2393:        buf = malloc(sizeof(*buf) * MAX_RX_BUF, M_DEVBUF, M_NOWAIT);
        !          2394:        if (buf == NULL)
        !          2395:                return (1);
        !          2396:
        !          2397:        bzero(buf, sizeof(*buf) * MAX_RX_BUF);
        !          2398:        sc->wp_rx_buffers = buf;
        !          2399:        sc->wp_rx_buffer_last = buf;
        !          2400:
        !          2401:        return (0);
        !          2402: }
        !          2403:
        !          2404: static void
        !          2405: aft_release_rx_buffers(xilinx_softc_t *sc)
        !          2406: {
        !          2407:        struct xilinx_rx_buffer *buf;
        !          2408:
        !          2409:        if (sc->wp_rx_buffers == NULL)
        !          2410:                return;
        !          2411:
        !          2412:        while ((buf = SIMPLEQ_FIRST(&sc->wp_rx_free_list)) != NULL) {
        !          2413:                SIMPLEQ_REMOVE_HEAD(&sc->wp_rx_free_list, entry);
        !          2414:                aft_release_rx_dma_buff(sc, buf);
        !          2415:        }
        !          2416:
        !          2417:        while ((buf = SIMPLEQ_FIRST(&sc->wp_rx_complete_list)) != NULL) {
        !          2418:                SIMPLEQ_REMOVE_HEAD(&sc->wp_rx_complete_list, entry);
        !          2419:                aft_release_rx_dma_buff(sc, buf);
        !          2420:        }
        !          2421:
        !          2422:        free(sc->wp_rx_buffers, M_DEVBUF);
        !          2423:
        !          2424:        sc->wp_rx_buffers = NULL;
        !          2425:        sc->wp_rx_buffer_last = NULL;
        !          2426: }
        !          2427:
        !          2428: /* Allocate an mbuf and setup dma_map. */
        !          2429: static int
        !          2430: aft_alloc_rx_dma_buff(xilinx_softc_t *sc, int num)
        !          2431: {
        !          2432:        struct xilinx_rx_buffer *buf, *ebuf;
        !          2433:        int n;
        !          2434:
        !          2435:        ebuf = sc->wp_rx_buffers + MAX_RX_BUF;
        !          2436:        buf = sc->wp_rx_buffer_last;
        !          2437:
        !          2438:        for (n = 0; n < num; n++) {
        !          2439:                int i;
        !          2440:                for (i = 0; i < MAX_RX_BUF; i++) {
        !          2441:                        if (buf->mbuf == NULL)
        !          2442:                                break;
        !          2443:                        if (++buf == ebuf)
        !          2444:                                buf = sc->wp_rx_buffers;
        !          2445:                }
        !          2446:
        !          2447:                if (buf->mbuf != NULL)
        !          2448:                        break;
        !          2449:
        !          2450:                sc->wp_rx_buffer_last = buf;
        !          2451:
        !          2452:                buf->mbuf = wan_mbuf_alloc(sc->dma_mtu);
        !          2453:                if (buf->mbuf == NULL)
        !          2454:                        break;
        !          2455:
        !          2456:                if (bus_dmamap_create(sc->dmatag, sc->dma_mtu, 1, sc->dma_mtu,
        !          2457:                    0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &buf->dma_map)) {
        !          2458:                        m_freem(buf->mbuf);
        !          2459:                        buf->mbuf = NULL;
        !          2460:                        break;
        !          2461:                }
        !          2462:
        !          2463:                if (bus_dmamap_load(sc->dmatag, buf->dma_map,
        !          2464:                    mtod(buf->mbuf, void *), sc->dma_mtu, NULL,
        !          2465:                    BUS_DMA_NOWAIT | BUS_DMA_READ)) {
        !          2466:                        aft_release_rx_dma_buff(sc, buf);
        !          2467:                        break;
        !          2468:                }
        !          2469:
        !          2470:                SIMPLEQ_INSERT_TAIL(&sc->wp_rx_free_list, buf, entry);
        !          2471:        }
        !          2472:
        !          2473:        return (n);
        !          2474: }
        !          2475:
        !          2476: static void
        !          2477: aft_reload_rx_dma_buff(xilinx_softc_t *sc, struct xilinx_rx_buffer *buf)
        !          2478: {
        !          2479:        bus_dmamap_unload(sc->dmatag, buf->dma_map);
        !          2480:        if (buf->mbuf == NULL) {
        !          2481:                buf->mbuf = wan_mbuf_alloc(sc->dma_mtu);
        !          2482:                if (buf->mbuf == NULL) {
        !          2483:                        bus_dmamap_destroy(sc->dmatag, buf->dma_map);
        !          2484:                        return;
        !          2485:                }
        !          2486:        }
        !          2487:        if (bus_dmamap_load(sc->dmatag, buf->dma_map, mtod(buf->mbuf, void *),
        !          2488:            sc->dma_mtu, NULL, BUS_DMA_NOWAIT | BUS_DMA_READ)) {
        !          2489:                aft_release_rx_dma_buff(sc, buf);
        !          2490:                return;
        !          2491:        }
        !          2492:
        !          2493:        SIMPLEQ_INSERT_TAIL(&sc->wp_rx_free_list, buf, entry);
        !          2494: }
        !          2495:
        !          2496: static void
        !          2497: aft_release_rx_dma_buff(xilinx_softc_t *sc, struct xilinx_rx_buffer *buf)
        !          2498: {
        !          2499:        bus_dmamap_destroy(sc->dmatag, buf->dma_map);
        !          2500:        m_freem(buf->mbuf);
        !          2501:        buf->mbuf = NULL;
        !          2502: }
        !          2503:
        !          2504: static void
        !          2505: enable_timer(void *card_id)
        !          2506: {
        !          2507:        sdla_t *card = (sdla_t *)card_id;
        !          2508:        int     s;
        !          2509:
        !          2510:        s = splnet();
        !          2511:        sdla_te_polling(card);
        !          2512:        splx(s);
        !          2513:
        !          2514:        return;
        !          2515: }
        !          2516:
        !          2517: static void
        !          2518: xilinx_process_packet(xilinx_softc_t *sc)
        !          2519: {
        !          2520:        struct ifnet    *ifp;
        !          2521:        struct mbuf     *new_m, *m;
        !          2522:        unsigned char    pkt_error;
        !          2523:
        !          2524:        WAN_ASSERT1(sc == NULL);
        !          2525:        for (;;) {
        !          2526:                struct xilinx_rx_buffer *buf;
        !          2527:                buf = SIMPLEQ_FIRST(&sc->wp_rx_complete_list);
        !          2528:                if (buf == NULL)
        !          2529:                        break;
        !          2530:
        !          2531:                SIMPLEQ_REMOVE_HEAD(&sc->wp_rx_complete_list, entry);
        !          2532:
        !          2533:                new_m = NULL;
        !          2534:                pkt_error = 0;
        !          2535:
        !          2536:                xilinx_rx_post_complete(sc->common.card, sc, buf, &new_m,
        !          2537:                    &pkt_error);
        !          2538:                if (new_m) {
        !          2539:                        ifp = (struct ifnet *)&sc->common.ifp;
        !          2540: #ifdef DEBUG_RX
        !          2541:                        log(LOG_INFO, "%s: Receiving packet %d bytes!\n",
        !          2542:                            ifp->if_xname, new_m->m_len);
        !          2543: #endif
        !          2544:                        wanpipe_generic_input(ifp, new_m);
        !          2545:                }
        !          2546:        }
        !          2547:
        !          2548:        for (;;) {
        !          2549:                IF_DEQUEUE(&sc->wp_tx_complete_list, m);
        !          2550:                if (m == NULL)
        !          2551:                        break;
        !          2552:                xilinx_tx_post_complete(sc->common.card, sc, m);
        !          2553:                m_freem(m);
        !          2554:        }
        !          2555:
        !          2556:        return;
        !          2557: }
        !          2558:
        !          2559: static int
        !          2560: fifo_error_interrupt(sdla_t *card, unsigned long reg)
        !          2561: {
        !          2562:        u_int32_t rx_status, tx_status;
        !          2563:        u_int32_t err = 0;
        !          2564:        u_int32_t i;
        !          2565:        xilinx_softc_t *sc;
        !          2566:
        !          2567: #ifdef DEBUG_ERR
        !          2568:        log(LOG_INFO, "%s: Fifo error interrupt!\n", card->devname);
        !          2569: #endif
        !          2570:
        !          2571:        /* Clear HDLC pending registers */
        !          2572:        sdla_bus_read_4(card->hw, XILINX_HDLC_TX_INTR_PENDING_REG, &tx_status);
        !          2573:        sdla_bus_read_4(card->hw, XILINX_HDLC_RX_INTR_PENDING_REG, &rx_status);
        !          2574:
        !          2575:        if (card->state != WAN_CONNECTED) {
        !          2576:                log(LOG_INFO, "%s: Warning: Ignoring Error Intr: link disc!\n",
        !          2577:                    card->devname);
        !          2578:                return (0);
        !          2579:        }
        !          2580:
        !          2581:        tx_status &= card->u.xilinx.active_ch_map;
        !          2582:        rx_status &= card->u.xilinx.active_ch_map;
        !          2583:
        !          2584:        if (tx_status != 0) {
        !          2585:                for (i = 0; i < card->u.xilinx.num_of_time_slots; i++) {
        !          2586:                        if (bit_test((u_int8_t *)&tx_status, i) &&
        !          2587:                            bit_test((u_int8_t *)&card->u.xilinx.logic_ch_map,
        !          2588:                            i)) {
        !          2589:                                struct ifnet    *ifp;
        !          2590:
        !          2591:                                sc = (xilinx_softc_t *)
        !          2592:                                    card->u.xilinx.dev_to_ch_map[i];
        !          2593:                                if (!sc) {
        !          2594:                                        log(LOG_INFO, "Warning: ignoring tx "
        !          2595:                                            "error intr: no dev!\n");
        !          2596:                                        continue;
        !          2597:                                }
        !          2598:
        !          2599:                                ifp = (struct ifnet *)&sc->common.ifp;
        !          2600: #if 0
        !          2601:                                if (!(ifp->if_flags & IFF_UP)) {
        !          2602:                                        log(LOG_INFO, "%s: Warning: ignoring "
        !          2603:                                            "tx error intr: dev down 0x%X "
        !          2604:                                            "UP=0x%X!\n", ifp->if_xname,
        !          2605:                                            sc->common.state,
        !          2606:                                            sc->ignore_modem);
        !          2607:                                        continue;
        !          2608:                                }
        !          2609: #endif
        !          2610:
        !          2611:                                if (card->state != WAN_CONNECTED) {
        !          2612:                                        log(LOG_INFO, "%s: Warning: ignoring "
        !          2613:                                            "tx error intr: dev disc!\n",
        !          2614:                                             ifp->if_xname);
        !          2615:                                        continue;
        !          2616:                                }
        !          2617:
        !          2618: #ifdef DEBUG_ERR
        !          2619:                                log(LOG_INFO, "%s:%s: Warning TX Fifo Error "
        !          2620:                                    "on LogicCh=%ld Slot=%d!\n",
        !          2621:                                    card->devname, sc->if_name,
        !          2622:                                    sc->logic_ch_num, i);
        !          2623: #endif
        !          2624:                                xilinx_tx_fifo_under_recover(card, sc);
        !          2625:                                err=EINVAL;
        !          2626:                        }
        !          2627:                }
        !          2628:        }
        !          2629:
        !          2630:
        !          2631:        if (rx_status != 0) {
        !          2632:                for (i = 0; i < card->u.xilinx.num_of_time_slots; i++) {
        !          2633:                        if (bit_test((u_int8_t *)&rx_status, i) &&
        !          2634:                            bit_test((u_int8_t *)&card->u.xilinx.logic_ch_map,
        !          2635:                            i)) {
        !          2636:                                struct ifnet    *ifp;
        !          2637:                                sc = (xilinx_softc_t *)
        !          2638:                                    card->u.xilinx.dev_to_ch_map[i];
        !          2639:                                if (!sc)
        !          2640:                                        continue;
        !          2641:
        !          2642:                                ifp = (struct ifnet *)&sc->common.ifp;
        !          2643: #if 0
        !          2644:                                if (!(ifp->if_flags & IFF_UP)) {
        !          2645:                                        log(LOG_INFO, "%s: Warning: ignoring "
        !          2646:                                            "rx error intr: dev down "
        !          2647:                                            "0x%X UP=0x%X!\n", ifp->if_xname,
        !          2648:                                            sc->common.state,
        !          2649:                                            sc->ignore_modem);
        !          2650:                                        continue;
        !          2651:                                }
        !          2652: #endif
        !          2653:
        !          2654:                                if (card->state != WAN_CONNECTED) {
        !          2655:                                        log(LOG_INFO, "%s: Warning: ignoring "
        !          2656:                                            "rx error intr: dev disc!\n",
        !          2657:                                            ifp->if_xname);
        !          2658:                                        continue;
        !          2659:                                }
        !          2660:
        !          2661: #ifdef DEBUG_ERR
        !          2662:                                log(LOG_INFO, "%s:%s: Warning RX Fifo Error "
        !          2663:                                    "on LCh=%ld Slot=%d RxDMA=%d\n",
        !          2664:                                    card->devname, sc->if_name,
        !          2665:                                     sc->logic_ch_num, i,
        !          2666:                                     sc->rx_dma);
        !          2667: #endif
        !          2668:
        !          2669: #if 0
        !          2670: {
        !          2671:                                unsigned long dma_descr;
        !          2672:                                unsigned int reg;
        !          2673:                                dma_descr = (sc->logic_ch_num << 4) +
        !          2674:                                    XILINX_RxDMA_DESCRIPTOR_HI;
        !          2675:                                sdla_bus_read_4(card->hw, dma_descr, &reg);
        !          2676:                                log(LOG_INFO, "%s: Hi Descriptor 0x%X\n",
        !          2677:                                    sc->if_name, reg);
        !          2678: }
        !          2679: #endif
        !          2680:
        !          2681:                                bit_set((u_int8_t *)&sc->pkt_error,
        !          2682:                                    WP_FIFO_ERROR_BIT);
        !          2683:                                err = EINVAL;
        !          2684:                        }
        !          2685:                }
        !          2686:        }
        !          2687:
        !          2688:        return (err);
        !          2689: }
        !          2690:
        !          2691:
        !          2692: static void
        !          2693: front_end_interrupt(sdla_t *card, unsigned long reg)
        !          2694: {
        !          2695:        sdla_te_intr(card);
        !          2696:        handle_front_end_state(card);
        !          2697:        return;
        !          2698: }
        !          2699:
        !          2700: /*
        !          2701:  * HARDWARE Interrupt Handlers
        !          2702:  */
        !          2703:
        !          2704:
        !          2705: /*
        !          2706:  * Main interrupt service routine.
        !          2707:  * Determine the interrupt received and handle it.
        !          2708:  */
        !          2709: static void
        !          2710: wp_xilinx_isr(sdla_t* card)
        !          2711: {
        !          2712:        int i;
        !          2713:        u_int32_t reg;
        !          2714:        u_int32_t dma_tx_reg, dma_rx_reg;
        !          2715:        xilinx_softc_t *sc;
        !          2716:
        !          2717:        if (bit_test((u_int8_t *)&card->critical, CARD_DOWN)) {
        !          2718:                log(LOG_INFO, "%s: Card down, ignoring interrupt !!!!!!!!\n",
        !          2719:                    card->devname);
        !          2720:                return;
        !          2721:        }
        !          2722:
        !          2723:        bit_set((u_int8_t *)&card->in_isr, 0);
        !          2724:
        !          2725: /*     write_cpld(card, LED_CONTROL_REG, 0x0F);*/
        !          2726:
        !          2727:        /*
        !          2728:         * Disable all chip Interrupts  (offset 0x040)
        !          2729:         *  -- "Transmit/Receive DMA Engine"  interrupt disable
        !          2730:         *  -- "FiFo/Line Abort Error"        interrupt disable
        !          2731:         */
        !          2732:        sdla_bus_read_4(card->hw, XILINX_CHIP_CFG_REG, &reg);
        !          2733:
        !          2734:        if (bit_test((u_int8_t *)&reg, SECURITY_STATUS_FLAG)) {
        !          2735:                log(LOG_INFO, "%s: Critical: Chip Security Compromised!\n",
        !          2736:                                        card->devname);
        !          2737:                log(LOG_INFO, "%s: Disabling Driver!\n",
        !          2738:                                        card->devname);
        !          2739:
        !          2740:                port_set_state(card, WAN_DISCONNECTED);
        !          2741:                disable_data_error_intr(card, CARD_DOWN);
        !          2742:                goto isr_end;
        !          2743:        }
        !          2744:
        !          2745:        /*
        !          2746:         * Note: If interrupts are received without pending flags, it usually
        !          2747:         * indicates that the interrupt * is being shared.
        !          2748:         */
        !          2749:        if (bit_test((u_int8_t *)&reg, FRONT_END_INTR_ENABLE_BIT)) {
        !          2750:                if (bit_test((u_int8_t *)&reg, FRONT_END_INTR_FLAG)) {
        !          2751:                        front_end_interrupt(card, reg);
        !          2752:                        if (card->u.xilinx.state_change_exit_isr) {
        !          2753:                                card->u.xilinx.state_change_exit_isr = 0;
        !          2754:                                /*
        !          2755:                                 * The state change occured, skip all
        !          2756:                                 * other interrupts
        !          2757:                                 */
        !          2758:                                goto isr_end;
        !          2759:                        }
        !          2760:                }
        !          2761:        }
        !          2762:
        !          2763:        /*
        !          2764:         * Test Fifo Error Interrupt
        !          2765:         * If set shutdown all interfaces and reconfigure
        !          2766:         */
        !          2767:        if (bit_test((u_int8_t *)&reg, ERROR_INTR_ENABLE_BIT))
        !          2768:                if (bit_test((u_int8_t *)&reg, ERROR_INTR_FLAG))
        !          2769:                        fifo_error_interrupt(card, reg);
        !          2770:
        !          2771:        /*
        !          2772:         * Checking for Interrupt source:
        !          2773:         * 1. Receive DMA Engine
        !          2774:         * 2. Transmit DMA Engine
        !          2775:         * 3. Error conditions.
        !          2776:         */
        !          2777:        if (bit_test((u_int8_t *)&reg, GLOBAL_INTR_ENABLE_BIT) &&
        !          2778:                bit_test((u_int8_t *)&reg, DMA_INTR_FLAG)) {
        !          2779:
        !          2780:                /* Receive DMA Engine */
        !          2781:                sdla_bus_read_4(card->hw, XILINX_DMA_RX_INTR_PENDING_REG,
        !          2782:                    &dma_rx_reg);
        !          2783:
        !          2784:                dma_rx_reg &= card->u.xilinx.active_ch_map;
        !          2785:
        !          2786:                if (dma_rx_reg == 0)
        !          2787:                        goto isr_rx;
        !          2788:
        !          2789:                for (i = 0; i < card->u.xilinx.num_of_time_slots; i++) {
        !          2790:                        if (bit_test((u_int8_t *)&dma_rx_reg, i) &&
        !          2791:                                bit_test((u_int8_t *)
        !          2792:                                    &card->u.xilinx.logic_ch_map, i)) {
        !          2793:                                sc = (xilinx_softc_t *)
        !          2794:                                    card->u.xilinx.dev_to_ch_map[i];
        !          2795:                                if (!sc) {
        !          2796:                                        log(LOG_INFO, "%s: Error: No Dev for "
        !          2797:                                            "Rx logical ch=%d\n",
        !          2798:                                            card->devname, i);
        !          2799:                                        continue;
        !          2800:                                }
        !          2801:
        !          2802:                                xilinx_dma_rx_complete(card, sc);
        !          2803:                        }
        !          2804:                }
        !          2805: isr_rx:
        !          2806:
        !          2807:                /* Transmit DMA Engine */
        !          2808:                sdla_bus_read_4(card->hw, XILINX_DMA_TX_INTR_PENDING_REG,
        !          2809:                    &dma_tx_reg);
        !          2810:
        !          2811:                dma_tx_reg &= card->u.xilinx.active_ch_map;
        !          2812:
        !          2813:                if (dma_tx_reg == 0)
        !          2814:                        goto isr_tx;
        !          2815:
        !          2816:                for (i = 0; i < card->u.xilinx.num_of_time_slots; i++) {
        !          2817:                        if (bit_test((u_int8_t *)&dma_tx_reg, i) &&
        !          2818:                                bit_test((u_int8_t *)
        !          2819:                                     &card->u.xilinx.logic_ch_map, i)) {
        !          2820:                                sc = (xilinx_softc_t *)
        !          2821:                                    card->u.xilinx.dev_to_ch_map[i];
        !          2822:                                if (!sc) {
        !          2823:                                        log(LOG_INFO, "%s: Error: No Dev for "
        !          2824:                                            "Tx logical ch=%d\n",
        !          2825:                                            card->devname, i);
        !          2826:                                        continue;
        !          2827:                                }
        !          2828:
        !          2829:                                xilinx_dma_tx_complete(card, sc);
        !          2830:                        }
        !          2831:                }
        !          2832:        }
        !          2833:
        !          2834: isr_tx:
        !          2835:
        !          2836: isr_end:
        !          2837:
        !          2838: /*     write_cpld(card, LED_CONTROL_REG, 0x0E); */
        !          2839:
        !          2840:        bit_clear((u_int8_t *)&card->in_isr, 0);
        !          2841:        return;
        !          2842: }
        !          2843:
        !          2844:
        !          2845: /*
        !          2846:  * TASK Functions and Triggers
        !          2847:  */
        !          2848:
        !          2849: /*
        !          2850:  * port_set_state
        !          2851:  *
        !          2852:  * Set PORT state.
        !          2853:  *
        !          2854:  */
        !          2855: static void
        !          2856: port_set_state(sdla_t *card, int state)
        !          2857: {
        !          2858:        wanpipe_common_t        *common;
        !          2859:
        !          2860:        if (card->state != state) {
        !          2861:                switch (state) {
        !          2862:                case WAN_CONNECTED:
        !          2863:                        log(LOG_INFO, "%s: Link connected!\n", card->devname);
        !          2864:                        aft_red_led_ctrl(card, AFT_LED_OFF);
        !          2865:                        aft_green_led_ctrl(card, AFT_LED_ON);
        !          2866:                        break;
        !          2867:
        !          2868:                case WAN_CONNECTING:
        !          2869:                        log(LOG_INFO, "%s: Link connecting...\n",
        !          2870:                            card->devname);
        !          2871:                        aft_red_led_ctrl(card, AFT_LED_ON);
        !          2872:                        aft_green_led_ctrl(card, AFT_LED_OFF);
        !          2873:                        break;
        !          2874:
        !          2875:                case WAN_DISCONNECTED:
        !          2876:                        log(LOG_INFO, "%s: Link disconnected!\n",
        !          2877:                            card->devname);
        !          2878:                        aft_red_led_ctrl(card, AFT_LED_ON);
        !          2879:                        aft_green_led_ctrl(card, AFT_LED_OFF);
        !          2880:                        break;
        !          2881:                }
        !          2882:                card->state = state;
        !          2883:                LIST_FOREACH(common, &card->dev_head, next) {
        !          2884:                        struct ifnet *ifp = (struct ifnet *)&common->ifp;
        !          2885:                        if (ifp)
        !          2886:                                set_chan_state(card, ifp, state);
        !          2887:                }
        !          2888:        }
        !          2889: }
        !          2890:
        !          2891:
        !          2892: /*
        !          2893:  * handle_front_end_state
        !          2894:  */
        !          2895:
        !          2896: static void
        !          2897: handle_front_end_state(void *card_id)
        !          2898: {
        !          2899:        sdla_t *card = (sdla_t *)card_id;
        !          2900:
        !          2901:        if (card->front_end_status == FE_CONNECTED) {
        !          2902:                enable_data_error_intr(card);
        !          2903:                port_set_state(card, WAN_CONNECTED);
        !          2904:                card->u.xilinx.state_change_exit_isr = 1;
        !          2905:        } else {
        !          2906:                port_set_state(card, WAN_CONNECTING);
        !          2907:                disable_data_error_intr(card, LINK_DOWN);
        !          2908:                card->u.xilinx.state_change_exit_isr = 1;
        !          2909:        }
        !          2910: }
        !          2911:
        !          2912: static unsigned char
        !          2913: read_cpld(sdla_t *card, unsigned short cpld_off)
        !          2914: {
        !          2915:        u_int16_t     org_off;
        !          2916:        u_int8_t      tmp;
        !          2917:
        !          2918:        cpld_off &= ~BIT_DEV_ADDR_CLEAR;
        !          2919:        cpld_off |= BIT_DEV_ADDR_CPLD;
        !          2920:
        !          2921:        /* Save the current address. */
        !          2922:        sdla_bus_read_2(card->hw, XILINX_MCPU_INTERFACE_ADDR, &org_off);
        !          2923:
        !          2924:        sdla_bus_write_2(card->hw, XILINX_MCPU_INTERFACE_ADDR, cpld_off);
        !          2925:
        !          2926:        sdla_bus_read_1(card->hw, XILINX_MCPU_INTERFACE, &tmp);
        !          2927:
        !          2928:        /* Restore original address */
        !          2929:        sdla_bus_write_2(card->hw, XILINX_MCPU_INTERFACE_ADDR, org_off);
        !          2930:
        !          2931:        return (tmp);
        !          2932: }
        !          2933:
        !          2934: static unsigned char
        !          2935: write_cpld(sdla_t *card, unsigned short off, unsigned char data)
        !          2936: {
        !          2937:        u_int16_t org_off;
        !          2938:
        !          2939:        off &= ~BIT_DEV_ADDR_CLEAR;
        !          2940:        off |= BIT_DEV_ADDR_CPLD;
        !          2941:
        !          2942:        /* Save the current original address */
        !          2943:        sdla_bus_read_2(card->hw, XILINX_MCPU_INTERFACE_ADDR, &org_off);
        !          2944:
        !          2945:        sdla_bus_write_2(card->hw, XILINX_MCPU_INTERFACE_ADDR, off);
        !          2946:
        !          2947:        /* This delay is required to avoid bridge optimization
        !          2948:         * (combining two writes together)*/
        !          2949:        DELAY(5);
        !          2950:
        !          2951:        sdla_bus_write_1(card->hw, XILINX_MCPU_INTERFACE, data);
        !          2952:
        !          2953:        /* This delay is required to avoid bridge optimization
        !          2954:         * (combining two writes together)*/
        !          2955:        DELAY(5);
        !          2956:
        !          2957:        /* Restore the original address */
        !          2958:        sdla_bus_write_2(card->hw, XILINX_MCPU_INTERFACE_ADDR, org_off);
        !          2959:
        !          2960:        return (0);
        !          2961: }
        !          2962:
        !          2963: static unsigned char
        !          2964: write_front_end_reg(void *card1, unsigned short off, unsigned char value)
        !          2965: {
        !          2966:        sdla_t *card = (sdla_t *)card1;
        !          2967:
        !          2968:        off &= ~BIT_DEV_ADDR_CLEAR;
        !          2969:        sdla_bus_write_2(card->hw, XILINX_MCPU_INTERFACE_ADDR, off);
        !          2970:        /*
        !          2971:         * These delays are required to avoid bridge optimization
        !          2972:         * (combining two writes together)
        !          2973:         */
        !          2974:        DELAY(5);
        !          2975:        sdla_bus_write_1(card->hw, XILINX_MCPU_INTERFACE, value);
        !          2976:        DELAY(5);
        !          2977:
        !          2978:        return (0);
        !          2979: }
        !          2980:
        !          2981:
        !          2982: /*
        !          2983:  * Read TE1/56K Front end registers
        !          2984:  */
        !          2985: static unsigned char
        !          2986: read_front_end_reg(void *card1, unsigned short off)
        !          2987: {
        !          2988:        sdla_t* card = (sdla_t *)card1;
        !          2989:        u_int8_t        tmp;
        !          2990:
        !          2991:        off &= ~BIT_DEV_ADDR_CLEAR;
        !          2992:        sdla_bus_write_2(card->hw, XILINX_MCPU_INTERFACE_ADDR, off);
        !          2993:        sdla_bus_read_1(card->hw, XILINX_MCPU_INTERFACE, &tmp);
        !          2994:        DELAY(5);
        !          2995:
        !          2996:        return (tmp);
        !          2997: }
        !          2998:
        !          2999:
        !          3000: /*
        !          3001:  *    Run only after the front end comes up from down state.
        !          3002:  *
        !          3003:  *    Clean the DMA Tx/Rx pending interrupts.
        !          3004:  *       (Ignore since we will reconfigure
        !          3005:  *        all dma descriptors. DMA controler
        !          3006:  *        was already disabled on link down)
        !          3007:  *
        !          3008:  *    For all channels clean Tx/Rx Fifo
        !          3009:  *
        !          3010:  *    Enable DMA controler
        !          3011:  *        (This starts the fifo cleaning
        !          3012:  *         process)
        !          3013:  *
        !          3014:  *    For all channels reprogram Tx/Rx DMA
        !          3015:  *    descriptors.
        !          3016:  *
        !          3017:  *    Clean the Tx/Rx Error pending interrupts.
        !          3018:  *        (Since dma fifo's are now empty)
        !          3019:  *
        !          3020:  *    Enable global DMA and Error interrutps.
        !          3021:  *
        !          3022:  */
        !          3023:
        !          3024: static void
        !          3025: enable_data_error_intr(sdla_t *card)
        !          3026: {
        !          3027:        wanpipe_common_t        *common;
        !          3028:        struct ifnet            *ifp;
        !          3029:        u_int32_t               reg;
        !          3030:
        !          3031:        /* Clean Tx/Rx DMA interrupts */
        !          3032:        sdla_bus_read_4(card->hw, XILINX_DMA_RX_INTR_PENDING_REG, &reg);
        !          3033:        sdla_bus_read_4(card->hw, XILINX_DMA_TX_INTR_PENDING_REG, &reg);
        !          3034:
        !          3035:        /* For all channels clean Tx/Rx fifos */
        !          3036:        LIST_FOREACH(common, &card->dev_head, next) {
        !          3037:                xilinx_softc_t *sc;
        !          3038:
        !          3039:                ifp = (struct ifnet *)&common->ifp;
        !          3040:                if (!ifp || !ifp->if_softc)
        !          3041:                        continue;
        !          3042:                sc = ifp->if_softc;
        !          3043: #if 0
        !          3044:                if (!(ifp->if_flags & IFF_UP))
        !          3045:                        continue;
        !          3046: #endif
        !          3047:
        !          3048: #ifdef DEBUG_INIT
        !          3049:                log(LOG_INFO, "%s: Init interface fifo no wait %s\n",
        !          3050:                        sc->if_name, __FUNCTION__);
        !          3051: #endif
        !          3052:                xilinx_init_rx_dev_fifo(card, sc, WP_NO_WAIT);
        !          3053:                xilinx_init_tx_dev_fifo(card, sc, WP_NO_WAIT);
        !          3054:        }
        !          3055:
        !          3056:        /*
        !          3057:         * Enable DMA controler, in order to start the
        !          3058:         * fifo cleaning
        !          3059:         */
        !          3060:        sdla_bus_read_4(card->hw, XILINX_DMA_CONTROL_REG, &reg);
        !          3061:        bit_set((u_int8_t *)&reg, DMA_ENGINE_ENABLE_BIT);
        !          3062:        sdla_bus_write_4(card->hw, XILINX_DMA_CONTROL_REG, reg);
        !          3063:
        !          3064:        /* For all channels clean Tx/Rx fifos */
        !          3065:        LIST_FOREACH(common, &card->dev_head, next) {
        !          3066:                xilinx_softc_t *sc;
        !          3067:
        !          3068:                ifp = (struct ifnet *)&common->ifp;
        !          3069:                if (!ifp || ifp->if_softc == NULL)
        !          3070:                        continue;
        !          3071:                sc = ifp->if_softc;
        !          3072: #if 0
        !          3073:                if (!(ifp->if_flags & IFF_UP))
        !          3074:                        continue;
        !          3075: #endif
        !          3076:
        !          3077:
        !          3078: #ifdef DEBUG_INIT
        !          3079:                log(LOG_INFO, "%s: Init interface fifo %s\n",
        !          3080:                    sc->if_name, __FUNCTION__);
        !          3081: #endif
        !          3082:
        !          3083:                xilinx_init_rx_dev_fifo(card, sc, WP_WAIT);
        !          3084:                xilinx_init_tx_dev_fifo(card, sc, WP_WAIT);
        !          3085:
        !          3086: #ifdef DEBUG_INIT
        !          3087:                log(LOG_INFO, "%s: Clearing Fifo and idle_flag %s\n",
        !          3088:                    card->devname, sc->if_name);
        !          3089: #endif
        !          3090:                bit_clear((u_int8_t *)&sc->idle_start, 0);
        !          3091:        }
        !          3092:
        !          3093:        /* For all channels, reprogram Tx/Rx DMA descriptors.
        !          3094:         * For Tx also make sure that the BUSY flag is clear
        !          3095:         * and previoulsy Tx packet is deallocated */
        !          3096:        LIST_FOREACH(common, &card->dev_head, next) {
        !          3097:                xilinx_softc_t *sc;
        !          3098:
        !          3099:                ifp = (struct ifnet *)&common->ifp;
        !          3100:                if (!ifp || !ifp->if_softc)
        !          3101:                        continue;
        !          3102:                sc = ifp->if_softc;
        !          3103: #if 0
        !          3104:                if (!(ifp->if_flags & IFF_UP)) {
        !          3105:                        continue;
        !          3106:                }
        !          3107: #endif
        !          3108:
        !          3109: #ifdef DEBUG_INIT
        !          3110:                log(LOG_INFO, "%s: Init interface %s\n",
        !          3111:                    sc->if_name, __FUNCTION__);
        !          3112: #endif
        !          3113:
        !          3114:                if (sc->rx_dma_buf) {
        !          3115:                        aft_reload_rx_dma_buff(sc, sc->rx_dma_buf);
        !          3116:                        sc->rx_dma_buf = NULL;
        !          3117:                }
        !          3118:
        !          3119:                xilinx_dma_rx(card, sc);
        !          3120:
        !          3121:                if (sc->tx_dma_addr && sc->tx_dma_len) {
        !          3122:                        sc->tx_dma_addr = 0;
        !          3123:                        sc->tx_dma_len = 0;
        !          3124:                }
        !          3125:
        !          3126:                if (sc->tx_dma_mbuf) {
        !          3127:                        bus_dmamap_unload(sc->dmatag, sc->tx_dmamap);
        !          3128:                        m_freem(sc->tx_dma_mbuf);
        !          3129:                        sc->tx_dma_mbuf = NULL;
        !          3130:                }
        !          3131:
        !          3132:                bit_clear((u_int8_t *)&sc->dma_status, TX_BUSY);
        !          3133:                bit_clear((u_int8_t *)&sc->idle_start, 0);
        !          3134:
        !          3135: #ifdef DEBUG_INIT
        !          3136:                log(LOG_INFO, "%s: Clearing Fifo and idle_flag %s\n",
        !          3137:                    card->devname, sc->if_name);
        !          3138: #endif
        !          3139:        }
        !          3140:
        !          3141:        /*
        !          3142:         * Clean Tx/Rx Error interrupts, since fifos are now
        !          3143:         * empty, and Tx fifo may generate an underrun which
        !          3144:         * we want to ignore :)
        !          3145:         */
        !          3146:        sdla_bus_read_4(card->hw, XILINX_HDLC_RX_INTR_PENDING_REG, &reg);
        !          3147:        sdla_bus_read_4(card->hw, XILINX_HDLC_TX_INTR_PENDING_REG, &reg);
        !          3148:
        !          3149:        /* Enable Global DMA and Error Interrupts */
        !          3150:        reg = 0;
        !          3151:        sdla_bus_read_4(card->hw, XILINX_CHIP_CFG_REG, &reg);
        !          3152:        bit_set((u_int8_t *)&reg, GLOBAL_INTR_ENABLE_BIT);
        !          3153:        bit_set((u_int8_t *)&reg, ERROR_INTR_ENABLE_BIT);
        !          3154:        sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, reg);
        !          3155:
        !          3156:        return;
        !          3157: }
        !          3158:
        !          3159: static void
        !          3160: disable_data_error_intr(sdla_t *card, unsigned char event)
        !          3161: {
        !          3162:        u_int32_t reg;
        !          3163:
        !          3164:        sdla_bus_read_4(card->hw, XILINX_CHIP_CFG_REG, &reg);
        !          3165:        bit_clear((u_int8_t *)&reg, GLOBAL_INTR_ENABLE_BIT);
        !          3166:        bit_clear((u_int8_t *)&reg, ERROR_INTR_ENABLE_BIT);
        !          3167:        if (event == DEVICE_DOWN)
        !          3168:                bit_clear((u_int8_t *)&reg, FRONT_END_INTR_ENABLE_BIT);
        !          3169:
        !          3170:        sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, reg);
        !          3171:
        !          3172:        sdla_bus_read_4(card->hw, XILINX_DMA_CONTROL_REG, &reg);
        !          3173:        bit_clear((u_int8_t *)&reg, DMA_ENGINE_ENABLE_BIT);
        !          3174:        sdla_bus_write_4(card->hw, XILINX_DMA_CONTROL_REG, reg);
        !          3175:
        !          3176: }
        !          3177:
        !          3178: static void
        !          3179: xilinx_init_tx_dma_descr(sdla_t *card, xilinx_softc_t *sc)
        !          3180: {
        !          3181:        unsigned long dma_descr;
        !          3182:        unsigned long reg = 0;
        !          3183:
        !          3184:        dma_descr = (sc->logic_ch_num << 4) + XILINX_TxDMA_DESCRIPTOR_HI;
        !          3185:        sdla_bus_write_4(card->hw, dma_descr, reg);
        !          3186: }
        !          3187:
        !          3188:
        !          3189:
        !          3190: static void
        !          3191: xilinx_tx_fifo_under_recover(sdla_t *card, xilinx_softc_t *sc)
        !          3192: {
        !          3193:        struct ifnet *ifp = (struct ifnet *)&sc->common.ifp;
        !          3194:        u_int32_t reg = 0;
        !          3195:        unsigned long dma_descr;
        !          3196:
        !          3197: #ifdef DEBUG_ERR
        !          3198:        log(LOG_INFO, "%s:%s: Tx Fifo Recovery \n",
        !          3199:            card->devname, sc->if_name);
        !          3200: #endif
        !          3201:
        !          3202:        /* Initialize Tx DMA descriptor: Stop DMA */
        !          3203:        dma_descr = (sc->logic_ch_num << 4) + XILINX_TxDMA_DESCRIPTOR_HI;
        !          3204:        sdla_bus_write_4(card->hw, dma_descr, reg);
        !          3205:
        !          3206:        /* Clean the TX FIFO */
        !          3207:        xilinx_init_tx_dev_fifo(card, sc, WP_WAIT);
        !          3208:        if (sc->tx_dma_addr && sc->tx_dma_len) {
        !          3209:                sc->tx_dma_addr = 0;
        !          3210:                sc->tx_dma_len = 0;
        !          3211:        }
        !          3212:
        !          3213:        /* Requeue the current tx packet, for re-transmission */
        !          3214:        if (sc->tx_dma_mbuf) {
        !          3215:                IF_PREPEND(&sc->wp_tx_pending_list,
        !          3216:                    (struct mbuf *)sc->tx_dma_mbuf);
        !          3217:                sc->tx_dma_mbuf = NULL;
        !          3218:        }
        !          3219:
        !          3220:        /*
        !          3221:         * Wake up the stack, because tx dma interrupt failed
        !          3222:         */
        !          3223:        if (ifp)
        !          3224:                ifp->if_oerrors++;
        !          3225:
        !          3226: #ifdef DEBUG_ERR
        !          3227:        log(LOG_INFO, "%s:%s: Tx Fifo Recovery: Restarting Transmission \n",
        !          3228:            card->devname, sc->if_name);
        !          3229: #endif
        !          3230:
        !          3231:        /* Re-start transmission */
        !          3232:        bit_clear((u_int8_t *)&sc->dma_status, TX_BUSY);
        !          3233:        if (!xilinx_dma_tx(card, sc)) {
        !          3234:                /* If we was able to transmit and the interface is set
        !          3235:                 * to OACTIVE remove this flag and let kernel try to
        !          3236:                 * transmit.
        !          3237:                 */
        !          3238:                if (ifp->if_flags & IFF_OACTIVE)
        !          3239:                        ifp->if_flags &= ~IFF_OACTIVE;
        !          3240:        }
        !          3241:        return;
        !          3242: }
        !          3243:
        !          3244: static int
        !          3245: xilinx_write_ctrl_hdlc(sdla_t *card, u_int32_t timeslot,
        !          3246:     u_int8_t reg_off, u_int32_t data)
        !          3247: {
        !          3248:        u_int32_t reg;
        !          3249:        u_int32_t ts_orig = timeslot;
        !          3250:        unsigned long timeout = ticks;
        !          3251:
        !          3252:        if (timeslot == 0)
        !          3253:                timeslot = card->u.xilinx.num_of_time_slots - 2;
        !          3254:        else if (timeslot == 1)
        !          3255:                timeslot = card->u.xilinx.num_of_time_slots - 1;
        !          3256:        else
        !          3257:                timeslot -= 2;
        !          3258:
        !          3259:        timeslot = timeslot << XILINX_CURRENT_TIMESLOT_SHIFT;
        !          3260:        timeslot &= XILINX_CURRENT_TIMESLOT_MASK;
        !          3261:
        !          3262:        for (;;) {
        !          3263:                sdla_bus_read_4(card->hw, XILINX_TIMESLOT_HDLC_CHAN_REG, &reg);
        !          3264:                reg &= XILINX_CURRENT_TIMESLOT_MASK;
        !          3265:
        !          3266:                if (reg == timeslot) {
        !          3267:                        sdla_bus_write_4(card->hw, reg_off, data);
        !          3268:                        return (0);
        !          3269:                }
        !          3270:
        !          3271:                if ((ticks-timeout) > 1) {
        !          3272:                        log(LOG_INFO, "%s: Error: Access to timeslot %d "
        !          3273:                            "timed out!\n", card->devname, ts_orig);
        !          3274:                        return (EIO);
        !          3275:                }
        !          3276:        }
        !          3277:
        !          3278:        return (EIO);
        !          3279: }
        !          3280:
        !          3281: static int
        !          3282: set_chan_state(sdla_t *card, struct ifnet *ifp, int state)
        !          3283: {
        !          3284:        xilinx_softc_t *sc = ifp->if_softc;
        !          3285:
        !          3286:        if (sc == NULL)
        !          3287:                return (0);
        !          3288:
        !          3289:        if (state == WAN_CONNECTED) {
        !          3290: #ifdef DEBUG_INIT
        !          3291:                log(LOG_INFO, "%s: Setting idle_start to 0\n", sc->if_name);
        !          3292: #endif
        !          3293:                bit_clear((u_int8_t *)&sc->idle_start, 0);
        !          3294:                sc->common.ifp.pp_up(&sc->common.ifp);
        !          3295:        } else if (state == WAN_DISCONNECTED)
        !          3296:                sc->common.ifp.pp_down(&sc->common.ifp);
        !          3297:
        !          3298:        return (0);
        !          3299: }
        !          3300:
        !          3301:
        !          3302: static char fifo_size_vector[] = {1, 2, 4, 8, 16, 32};
        !          3303: static char fifo_code_vector[] = {0, 1, 3, 7, 0xF, 0x1F};
        !          3304:
        !          3305: static int
        !          3306: request_fifo_baddr_and_size(sdla_t *card, xilinx_softc_t *sc)
        !          3307: {
        !          3308:        unsigned char req_fifo_size, fifo_size;
        !          3309:        int i;
        !          3310:
        !          3311:        /*
        !          3312:         * Calculate the optimal fifo size based
        !          3313:         * on the number of time slots requested
        !          3314:         */
        !          3315:
        !          3316:        if (IS_T1(&card->fe_te.te_cfg)) {
        !          3317:                if (sc->num_of_time_slots == NUM_OF_T1_CHANNELS)
        !          3318:                        req_fifo_size = 32;
        !          3319:                else if (sc->num_of_time_slots == 1)
        !          3320:                        req_fifo_size = 1;
        !          3321:                else if (sc->num_of_time_slots == 2 ||
        !          3322:                    sc->num_of_time_slots == 3)
        !          3323:                        req_fifo_size = 2;
        !          3324:                else if (sc->num_of_time_slots >= 4 &&
        !          3325:                    sc->num_of_time_slots <= 7)
        !          3326:                        req_fifo_size = 4;
        !          3327:                else if (sc->num_of_time_slots >= 8 &&
        !          3328:                    sc->num_of_time_slots <= 15)
        !          3329:                        req_fifo_size = 8;
        !          3330:                else if (sc->num_of_time_slots >= 16 &&
        !          3331:                    sc->num_of_time_slots <= 23)
        !          3332:                        req_fifo_size = 16;
        !          3333:                else {
        !          3334:                        log(LOG_INFO, "%s: Invalid number of timeslots %d\n",
        !          3335:                            card->devname, sc->num_of_time_slots);
        !          3336:                        return (EINVAL);
        !          3337:                }
        !          3338:        } else {
        !          3339:                if (sc->num_of_time_slots == (NUM_OF_E1_CHANNELS-1))
        !          3340:                        req_fifo_size = 32;
        !          3341:                else if (sc->num_of_time_slots == 1)
        !          3342:                        req_fifo_size = 1;
        !          3343:                else if (sc->num_of_time_slots == 2 ||
        !          3344:                    sc->num_of_time_slots == 3)
        !          3345:                        req_fifo_size = 2;
        !          3346:                else if (sc->num_of_time_slots >= 4 &&
        !          3347:                    sc->num_of_time_slots <= 7)
        !          3348:                        req_fifo_size = 4;
        !          3349:                else if (sc->num_of_time_slots >= 8 &&
        !          3350:                    sc->num_of_time_slots <= 15)
        !          3351:                        req_fifo_size = 8;
        !          3352:                else if (sc->num_of_time_slots >= 16 &&
        !          3353:                    sc->num_of_time_slots <= 31)
        !          3354:                        req_fifo_size = 16;
        !          3355:                else {
        !          3356:                        log(LOG_INFO,
        !          3357:                            "%s:%s: Invalid number of timeslots %d\n",
        !          3358:                            card->devname, sc->if_name, sc->num_of_time_slots);
        !          3359:                        return (EINVAL);
        !          3360:                }
        !          3361:        }
        !          3362:
        !          3363: #ifdef DEBUG_INIT
        !          3364:        log(LOG_INFO, "%s:%s: Optimal Fifo Size =%d  Timeslots=%d \n",
        !          3365:            card->devname, sc->if_name, req_fifo_size, sc->num_of_time_slots);
        !          3366: #endif
        !          3367:        fifo_size = map_fifo_baddr_and_size(card, req_fifo_size,
        !          3368:            &sc->fifo_base_addr);
        !          3369:
        !          3370:        if (fifo_size == 0 || sc->fifo_base_addr == 31) {
        !          3371:                log(LOG_INFO, "%s:%s: Error: Failed to obtain fifo size %d "
        !          3372:                    "or addr %d\n", card->devname, sc->if_name, fifo_size,
        !          3373:                    sc->fifo_base_addr);
        !          3374:                return (EINVAL);
        !          3375:        }
        !          3376:
        !          3377: #ifdef DEBUG_INIT
        !          3378:        log(LOG_INFO, "%s:%s: Optimal Fifo Size =%d TS=%d New Fifo Size=%d\n",
        !          3379:            card->devname, sc->if_name, req_fifo_size, sc->num_of_time_slots,
        !          3380:            fifo_size);
        !          3381: #endif
        !          3382:
        !          3383:        for (i = 0; i < sizeof(fifo_size_vector); i++) {
        !          3384:                if (fifo_size_vector[i] == fifo_size) {
        !          3385:                        sc->fifo_size_code = fifo_code_vector[i];
        !          3386:                        break;
        !          3387:                }
        !          3388:        }
        !          3389:
        !          3390:        if (fifo_size != req_fifo_size)
        !          3391:                log(LOG_INFO, "%s:%s: WARN: Failed to obtain the req "
        !          3392:                    "fifo %d got %d\n", card->devname, sc->if_name,
        !          3393:                    req_fifo_size, fifo_size);
        !          3394:
        !          3395: #ifdef DEBUG_INIT
        !          3396:        log(LOG_INFO, "%s: %s:Fifo Size=%d  TS=%d Fifo Code=%d Addr=%d\n",
        !          3397:            card->devname, sc->if_name, fifo_size, sc->num_of_time_slots,
        !          3398:            sc->fifo_size_code, sc->fifo_base_addr);
        !          3399: #endif
        !          3400:        sc->fifo_size = fifo_size;
        !          3401:
        !          3402:        return (0);
        !          3403: }
        !          3404:
        !          3405:
        !          3406: static int
        !          3407: map_fifo_baddr_and_size(sdla_t *card, unsigned char fifo_size,
        !          3408:     unsigned char *addr)
        !          3409: {
        !          3410:        u_int32_t reg = 0;
        !          3411:        int i;
        !          3412:
        !          3413:        for (i = 0; i < fifo_size; i++)
        !          3414:                bit_set((u_int8_t *)&reg, i);
        !          3415:
        !          3416: #ifdef DEBUG_INIT
        !          3417:        log(LOG_INFO, "%s: Trying to MAP 0x%X  to 0x%lX\n",
        !          3418:             card->devname, reg, card->u.xilinx.fifo_addr_map);
        !          3419: #endif
        !          3420:        for (i = 0; i < 32; i += fifo_size) {
        !          3421:                if (card->u.xilinx.fifo_addr_map & (reg << i))
        !          3422:                        continue;
        !          3423:                card->u.xilinx.fifo_addr_map |= reg << i;
        !          3424:                *addr = i;
        !          3425:
        !          3426: #ifdef DEBUG_INIT
        !          3427:                log(LOG_INFO, "%s: Card fifo Map 0x%lX Addr =%d\n",
        !          3428:                    card->devname, card->u.xilinx.fifo_addr_map, i);
        !          3429: #endif
        !          3430:                return (fifo_size);
        !          3431:        }
        !          3432:
        !          3433:        if (fifo_size == 1)
        !          3434:                return (0);
        !          3435:
        !          3436:        fifo_size = fifo_size >> 1;
        !          3437:
        !          3438:        return map_fifo_baddr_and_size(card, fifo_size, addr);
        !          3439: }
        !          3440:
        !          3441:
        !          3442: static int
        !          3443: free_fifo_baddr_and_size(sdla_t *card, xilinx_softc_t *sc)
        !          3444: {
        !          3445:        u_int32_t reg = 0;
        !          3446:        int i;
        !          3447:
        !          3448:        for (i = 0; i < sc->fifo_size; i++)
        !          3449:                bit_set((u_int8_t *)&reg, i);
        !          3450:
        !          3451: #ifdef DEBUG_INIT
        !          3452:        log(LOG_INFO, "%s: Unmapping 0x%X from 0x%lX\n", card->devname,
        !          3453:            reg << sc->fifo_base_addr, card->u.xilinx.fifo_addr_map);
        !          3454: #endif
        !          3455:        card->u.xilinx.fifo_addr_map &= ~(reg << sc->fifo_base_addr);
        !          3456:
        !          3457: #ifdef DEBUG_INIT
        !          3458:        log(LOG_INFO, "%s: New Map is 0x%lX\n",
        !          3459:                card->devname, card->u.xilinx.fifo_addr_map);
        !          3460: #endif
        !          3461:
        !          3462:        sc->fifo_size = 0;
        !          3463:        sc->fifo_base_addr = 0;
        !          3464:
        !          3465:        return (0);
        !          3466: }
        !          3467:
        !          3468: static void
        !          3469: aft_red_led_ctrl(sdla_t *card, int mode)
        !          3470: {
        !          3471:        unsigned int led;
        !          3472:
        !          3473:        sdla_bus_read_4(card->hw, XILINX_CHIP_CFG_REG, &led);
        !          3474:
        !          3475:        if (mode == AFT_LED_ON)
        !          3476:                bit_clear((u_int8_t *)&led, XILINX_RED_LED);
        !          3477:        else if (mode == AFT_LED_OFF)
        !          3478:                bit_set((u_int8_t *)&led, XILINX_RED_LED);
        !          3479:        else {
        !          3480:                if (bit_test((u_int8_t *)&led, XILINX_RED_LED))
        !          3481:                        bit_clear((u_int8_t *)&led, XILINX_RED_LED);
        !          3482:                else
        !          3483:                        bit_set((u_int8_t *)&led, XILINX_RED_LED);
        !          3484:        }
        !          3485:
        !          3486:        sdla_bus_write_4(card->hw, XILINX_CHIP_CFG_REG, led);
        !          3487: }
        !          3488:
        !          3489: static void
        !          3490: aft_led_timer(void *data)
        !          3491: {
        !          3492:        sdla_t *card=(sdla_t *)data;
        !          3493:        unsigned int te_alarm;
        !          3494:
        !          3495:        if (bit_test((u_int8_t *)&card->critical, CARD_DOWN))
        !          3496:                return;
        !          3497:
        !          3498:        if (IS_TE1(&card->fe_te.te_cfg)) {
        !          3499:                int s = splnet();
        !          3500:
        !          3501:                te_alarm = sdla_te_alarm(card, 0);
        !          3502:                te_alarm &= ~(BIT_OOSMF_ALARM|BIT_OOCMF_ALARM);
        !          3503:
        !          3504:                if (!te_alarm) {
        !          3505:                        if (card->state == WAN_CONNECTED) {
        !          3506:                                aft_red_led_ctrl(card, AFT_LED_OFF);
        !          3507:                                aft_green_led_ctrl(card, AFT_LED_ON);
        !          3508:                        } else {
        !          3509:                                aft_red_led_ctrl(card, AFT_LED_OFF);
        !          3510:                                aft_green_led_ctrl(card, AFT_LED_TOGGLE);
        !          3511:                        }
        !          3512:
        !          3513:                } else if (te_alarm & (BIT_RED_ALARM|BIT_LOS_ALARM)) {
        !          3514:                        /* Red or LOS Alarm solid RED */
        !          3515:                        aft_red_led_ctrl(card, AFT_LED_ON);
        !          3516:                        aft_green_led_ctrl(card, AFT_LED_OFF);
        !          3517:                } else if (te_alarm & BIT_OOF_ALARM) {
        !          3518:                        /* OOF Alarm flashing RED */
        !          3519:                        aft_red_led_ctrl(card, AFT_LED_TOGGLE);
        !          3520:                        aft_green_led_ctrl(card, AFT_LED_OFF);
        !          3521:                } else if (te_alarm & BIT_AIS_ALARM) {
        !          3522:                        /* AIS - Blue Alarm flasing RED and GREEN */
        !          3523:                        aft_red_led_ctrl(card, AFT_LED_TOGGLE);
        !          3524:                        aft_green_led_ctrl(card, AFT_LED_TOGGLE);
        !          3525:                } else if (te_alarm & BIT_YEL_ALARM) {
        !          3526:                        /* Yellow Alarm */
        !          3527:                        aft_red_led_ctrl(card, AFT_LED_ON);
        !          3528:                        aft_green_led_ctrl(card, AFT_LED_ON);
        !          3529:                } else {
        !          3530:
        !          3531:                        /* Default case shouldn't happen */
        !          3532:                        log(LOG_INFO, "%s: Unknown Alarm 0x%X\n",
        !          3533:                            card->devname, te_alarm);
        !          3534:                        aft_red_led_ctrl(card, AFT_LED_ON);
        !          3535:                        aft_green_led_ctrl(card, AFT_LED_ON);
        !          3536:                }
        !          3537:
        !          3538:                splx(s);
        !          3539:                timeout_add(&card->u.xilinx.led_timer, hz);
        !          3540:        }
        !          3541: }
        !          3542:
        !          3543:
        !          3544: int
        !          3545: aft_core_ready(sdla_t *card)
        !          3546: {
        !          3547:        u_int32_t reg;
        !          3548:        volatile unsigned char cnt = 0;
        !          3549:
        !          3550:        for (;;) {
        !          3551:                sdla_bus_read_4(card->hw, XILINX_CHIP_CFG_REG, &reg);
        !          3552:                if (!bit_test((u_int8_t *)&reg, HDLC_CORE_READY_FLAG_BIT)) {
        !          3553:                        /* The HDLC Core is not ready! we have
        !          3554:                        ** an error. */
        !          3555:                        if (++cnt > 5)
        !          3556:                                return  (EINVAL);
        !          3557:                        else
        !          3558:                                DELAY(500);
        !          3559:                                /* WARNING: we cannot do this while in
        !          3560:                                 * critical area */
        !          3561:                } else
        !          3562:                        return (0);
        !          3563:        }
        !          3564:
        !          3565:        return (EINVAL);
        !          3566: }

CVSweb