unsigned int max_intcnt = 0;
unsigned int max_bh = 0;

/*-----------------------------------------------------------------------------
 * musycc.c -
 *
 * Copyright (C) 2007  One Stop Systems, Inc.
 * Copyright (C) 2003-2006  SBE, Inc.
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 * For further information, contact via email: support@onestopsystems.com
 * One Stop Systems, Inc.  Escondido, California  U.S.A.
 *-----------------------------------------------------------------------------
 */

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/types.h>
#include "pmcc4_sysdep.h"
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/init.h>
#include "sbecom_inline_linux.h"
#include "libsbew.h"
#include "pmcc4_private.h"
#include "pmcc4.h"
#include "musycc.h"

#define sd_find_chan(ci,ch)   c4_find_chan(ch)


/*******************************************************************/
/* global driver variables */
extern ci_t *c4_list;
extern int  drvr_state;
extern int  cxt1e1_log_level;

extern int  cxt1e1_max_mru;
extern int  cxt1e1_max_mtu;
extern int  max_rxdesc_used;
extern int  max_txdesc_used;
extern ci_t *CI;                /* dummy pointr to board ZEROE's data - DEBUG
				 * USAGE */


/*******************************************************************/
/* forward references */
void        c4_fifo_free(mpi_t *, int);
void        c4_wk_chan_restart(mch_t *);
void        musycc_bh_tx_eom(mpi_t *, int);
int         musycc_chan_up(ci_t *, int);
status_t __init musycc_init(ci_t *);
void        musycc_intr_bh_tasklet(ci_t *);
void        musycc_serv_req(mpi_t *, u_int32_t);
void        musycc_update_timeslots(mpi_t *);

/*******************************************************************/

#if 1
static int
musycc_dump_rxbuffer_ring(mch_t *ch, int lockit)
{
    struct mdesc *m;
    unsigned long flags = 0;

    u_int32_t status;
    int         n;

    if (lockit)
	spin_lock_irqsave(&ch->ch_rxlock, flags);
    if (ch->rxd_num == 0)
	pr_info("  ZERO receive buffers allocated for this channel.");
    else {
	FLUSH_MEM_READ();
	m = &ch->mdr[ch->rxix_irq_srv];
	for (n = ch->rxd_num; n; n--) {
	    status = le32_to_cpu(m->status);
	    {
		pr_info("%c  %08lx[%2d]: sts %08x (%c%c%c%c:%d.) Data [%08x] Next [%08x]\n",
			(m == &ch->mdr[ch->rxix_irq_srv]) ? 'F' : ' ',
			(unsigned long) m, n,
			status,
			m->data ? (status & HOST_RX_OWNED ? 'H' : 'M') : '-',
			status & POLL_DISABLED ? 'P' : '-',
			status & EOBIRQ_ENABLE ? 'b' : '-',
			status & EOMIRQ_ENABLE ? 'm' : '-',
			status & LENGTH_MASK,
			le32_to_cpu(m->data), le32_to_cpu(m->next));
#ifdef RLD_DUMP_BUFDATA
		{
		    u_int32_t  *dp;
		    int         len = status & LENGTH_MASK;

#if 1
		    if (m->data && (status & HOST_RX_OWNED))
#else
		    if (m->data)    /* always dump regardless of valid RX
				     * data */
#endif
		    {
			dp = (u_int32_t *) OS_phystov((void *) (le32_to_cpu(m->data)));
			if (len >= 0x10)
			    pr_info("    %x[%x]: %08X %08X %08X %08x\n", (u_int32_t) dp, len,
				    *dp, *(dp + 1), *(dp + 2), *(dp + 3));
			else if (len >= 0x08)
			    pr_info("    %x[%x]: %08X %08X\n", (u_int32_t) dp, len,
				    *dp, *(dp + 1));
			else
			    pr_info("    %x[%x]: %08X\n", (u_int32_t) dp, len, *dp);
		    }
		}
#endif
	    }
	    m = m->snext;
	}
    }                               /* -for- */
    pr_info("\n");

    if (lockit)
	spin_unlock_irqrestore(&ch->ch_rxlock, flags);
    return 0;
}
#endif

#if 1
static int
musycc_dump_txbuffer_ring(mch_t *ch, int lockit)
{
    struct mdesc *m;
    unsigned long flags = 0;
    u_int32_t   status;
    int         n;

    if (lockit)
	spin_lock_irqsave(&ch->ch_txlock, flags);
    if (ch->txd_num == 0)
	pr_info("  ZERO transmit buffers allocated for this channel.");
    else {
	FLUSH_MEM_READ();
	m = ch->txd_irq_srv;
	for (n = ch->txd_num; n; n--) {
	    status = le32_to_cpu(m->status);
	    {
		pr_info("%c%c %08lx[%2d]: sts %08x (%c%c%c%c:%d.) Data [%08x] Next [%08x]\n",
			(m == ch->txd_usr_add) ? 'F' : ' ',
			(m == ch->txd_irq_srv) ? 'L' : ' ',
			(unsigned long) m, n,
			status,
		     m->data ? (status & MUSYCC_TX_OWNED ? 'M' : 'H') : '-',
			status & POLL_DISABLED ? 'P' : '-',
			status & EOBIRQ_ENABLE ? 'b' : '-',
			status & EOMIRQ_ENABLE ? 'm' : '-',
			status & LENGTH_MASK,
			le32_to_cpu(m->data), le32_to_cpu(m->next));
#ifdef RLD_DUMP_BUFDATA
		{
		    u_int32_t  *dp;
		    int         len = status & LENGTH_MASK;

		    if (m->data) {
			dp = (u_int32_t *) OS_phystov((void *) (le32_to_cpu(m->data)));
			if (len >= 0x10)
			    pr_info("    %x[%x]: %08X %08X %08X %08x\n", (u_int32_t) dp, len,
				    *dp, *(dp + 1), *(dp + 2), *(dp + 3));
			else if (len >= 0x08)
			    pr_info("    %x[%x]: %08X %08X\n", (u_int32_t) dp, len,
				    *dp, *(dp + 1));
			else
			    pr_info("    %x[%x]: %08X\n", (u_int32_t) dp, len, *dp);
		    }
		}
#endif
	    }
	    m = m->snext;
	}
    }                               /* -for- */
    pr_info("\n");

    if (lockit)
	spin_unlock_irqrestore(&ch->ch_txlock, flags);
    return 0;
}
#endif


/*
 * The following supports a backdoor debug facility which can be used to
 * display the state of a board's channel.
 */

status_t
musycc_dump_ring(ci_t *ci, unsigned int chan)
{
    mch_t      *ch;

    if (chan >= MAX_CHANS_USED)
	return SBE_DRVR_FAIL;       /* E2BIG */
    {
	int         bh;

	bh = atomic_read(&ci->bh_pending);
	pr_info(">> bh_pend %d [%d] ihead %d itail %d [%d] th_cnt %d bh_cnt %d wdcnt %d note %d\n",
		bh, max_bh, ci->iqp_headx, ci->iqp_tailx, max_intcnt,
		ci->intlog.drvr_intr_thcount,
		ci->intlog.drvr_intr_bhcount,
		ci->wdcount, ci->wd_notify);
	max_bh = 0;                 /* reset counter */
	max_intcnt = 0;             /* reset counter */
    }

    if (!(ch = sd_find_chan(dummy, chan))) {
	pr_info(">> musycc_dump_ring: channel %d not up.\n", chan);
	return ENOENT;
    }
    pr_info(">> CI %p CHANNEL %3d @ %p: state %x status/p %x/%x\n", ci, chan, ch, ch->state,
	    ch->status, ch->p.status);
    pr_info("--------------------------------\nTX Buffer Ring - Channel %d, txd_num %d. (bd/ch pend %d %d), TXD required %d, txpkt %lu\n",
	    chan, ch->txd_num,
	    (u_int32_t) atomic_read(&ci->tx_pending), (u_int32_t) atomic_read(&ch->tx_pending), ch->txd_required, ch->s.tx_packets);
    pr_info("++ User 0x%p IRQ_SRV 0x%p USR_ADD 0x%p QStopped %x, start_tx %x tx_full %d txd_free %d mode %x\n",
	    ch->user, ch->txd_irq_srv, ch->txd_usr_add,
	    sd_queue_stopped(ch->user),
	    ch->ch_start_tx, ch->tx_full, ch->txd_free, ch->p.chan_mode);
    musycc_dump_txbuffer_ring(ch, 1);
    pr_info("RX Buffer Ring - Channel %d, rxd_num %d. IRQ_SRV[%d] 0x%p, start_rx %x rxpkt %lu\n",
	    chan, ch->rxd_num, ch->rxix_irq_srv,
	    &ch->mdr[ch->rxix_irq_srv], ch->ch_start_rx, ch->s.rx_packets);
    musycc_dump_rxbuffer_ring(ch, 1);

    return SBE_DRVR_SUCCESS;
}


status_t
musycc_dump_rings(ci_t *ci, unsigned int start_chan)
{
    unsigned int chan;

    for (chan = start_chan; chan < (start_chan + 5); chan++)
	musycc_dump_ring(ci, chan);
    return SBE_DRVR_SUCCESS;
}


/*
 * NOTE on musycc_init_mdt():  These MUSYCC writes are only operational after
 * a MUSYCC GROUP_INIT command has been issued.
 */

void
musycc_init_mdt(mpi_t *pi)
{
    u_int32_t  *addr, cfg;
    int         i;

    /*
     * This Idle Code insertion takes effect prior to channel's first
     * transmitted  message.  After that, each message contains its own Idle
     * Code information which is to be issued after the message is
     * transmitted (Ref.MUSYCC 5.2.2.3: MCENBL bit in Group Configuration
     * Descriptor).
     */

    addr = (u_int32_t *) ((u_long) pi->reg + MUSYCC_MDT_BASE03_ADDR);
    cfg = CFG_CH_FLAG_7E << IDLE_CODE;

    for (i = 0; i < 32; addr++, i++)
	pci_write_32(addr, cfg);
}


/* Set TX thp to the next unprocessed md */

void
musycc_update_tx_thp(mch_t *ch)
{
    struct mdesc *md;
    unsigned long flags;

    spin_lock_irqsave(&ch->ch_txlock, flags);
    while (1) {
	md = ch->txd_irq_srv;
	FLUSH_MEM_READ();
	if (!md->data) {
	    /* No MDs with buffers to process */
	    spin_unlock_irqrestore(&ch->ch_txlock, flags);
	    return;
	}
	if ((le32_to_cpu(md->status)) & MUSYCC_TX_OWNED) {
	    /* this is the MD to restart TX with */
	    break;
	}
	/*
	 * Otherwise, we have a valid, host-owned message descriptor which
	 * has been successfully transmitted and whose buffer can be freed,
	 * so... process this MD, it's owned by the host.  (This might give
	 * as a new, updated txd_irq_srv.)
	 */
	musycc_bh_tx_eom(ch->up, ch->gchan);
    }
    md = ch->txd_irq_srv;
    ch->up->regram->thp[ch->gchan] = cpu_to_le32(OS_vtophys(md));
    FLUSH_MEM_WRITE();

    if (ch->tx_full) {
	ch->tx_full = 0;
	ch->txd_required = 0;
	sd_enable_xmit(ch->user);  /* re-enable to catch flow controlled
				     * channel */
    }
    spin_unlock_irqrestore(&ch->ch_txlock, flags);

#ifdef RLD_TRANS_DEBUG
    pr_info("++ musycc_update_tx_thp[%d]: setting thp = %p, sts %x\n", ch->channum, md, md->status);
#endif
}


/*
 * This is the workq task executed by the OS when our queue_work() is
 * scheduled and run.  It can fire off either RX or TX ACTIVATION depending
 * upon the channel's ch_start_tx and ch_start_rx variables.  This routine
 * is implemented as a work queue so that the call to the service request is
 * able to sleep, awaiting an interrupt acknowledgment response (SACK) from
 * the hardware.
 */

void
musycc_wq_chan_restart(void *arg)      /* channel private structure */
{
    mch_t      *ch;
    mpi_t      *pi;
    struct mdesc *md;
#if 0
    unsigned long flags;
#endif

    ch = container_of(arg, struct c4_chan_info, ch_work);
    pi = ch->up;

#ifdef RLD_TRANS_DEBUG
    pr_info("wq_chan_restart[%d]: start_RT[%d/%d] status %x\n",
	    ch->channum, ch->ch_start_rx, ch->ch_start_tx, ch->status);

#endif

    /**********************************/
    /** check for RX restart request **/
    /**********************************/

    if ((ch->ch_start_rx) && (ch->status & RX_ENABLED)) {

	ch->ch_start_rx = 0;
#if defined(RLD_TRANS_DEBUG) || defined(RLD_RXACT_DEBUG)
	{
	    static int  hereb4 = 7;

	    if (hereb4) {            /* RLD DEBUG */
		hereb4--;
#ifdef RLD_TRANS_DEBUG
		md = &ch->mdr[ch->rxix_irq_srv];
		pr_info("++ musycc_wq_chan_restart[%d] CHAN RX ACTIVATE: rxix_irq_srv %d, md %p sts %x, rxpkt %lu\n",
		ch->channum, ch->rxix_irq_srv, md, le32_to_cpu(md->status),
			ch->s.rx_packets);
#elif defined(RLD_RXACT_DEBUG)
		md = &ch->mdr[ch->rxix_irq_srv];
		pr_info("++ musycc_wq_chan_restart[%d] CHAN RX ACTIVATE: rxix_irq_srv %d, md %p sts %x, rxpkt %lu\n",
		ch->channum, ch->rxix_irq_srv, md, le32_to_cpu(md->status),
			ch->s.rx_packets);
		musycc_dump_rxbuffer_ring(ch, 1);      /* RLD DEBUG */
#endif
	    }
	}
#endif
	musycc_serv_req(pi, SR_CHANNEL_ACTIVATE | SR_RX_DIRECTION | ch->gchan);
    }
    /**********************************/
    /** check for TX restart request **/
    /**********************************/

    if ((ch->ch_start_tx) && (ch->status & TX_ENABLED)) {
	/* find next unprocessed message, then set TX thp to it */
	musycc_update_tx_thp(ch);

#if 0
	spin_lock_irqsave(&ch->ch_txlock, flags);
#endif
	md = ch->txd_irq_srv;
	if (!md) {
#ifdef RLD_TRANS_DEBUG
	    pr_info("-- musycc_wq_chan_restart[%d]: WARNING, starting NULL md\n", ch->channum);
#endif
#if 0
	    spin_unlock_irqrestore(&ch->ch_txlock, flags);
#endif
	} else if (md->data && ((le32_to_cpu(md->status)) & MUSYCC_TX_OWNED)) {
	    ch->ch_start_tx = 0;
#if 0
	    spin_unlock_irqrestore(&ch->ch_txlock, flags);   /* allow interrupts for service request */
#endif
#ifdef RLD_TRANS_DEBUG
	    pr_info("++ musycc_wq_chan_restart() CHAN TX ACTIVATE: chan %d txd_irq_srv %p = sts %x, txpkt %lu\n",
		    ch->channum, ch->txd_irq_srv, ch->txd_irq_srv->status, ch->s.tx_packets);
#endif
	    musycc_serv_req(pi, SR_CHANNEL_ACTIVATE | SR_TX_DIRECTION | ch->gchan);
	}
#ifdef RLD_RESTART_DEBUG
	else {
	    /* retain request to start until retried and we have data to xmit */
	    pr_info("-- musycc_wq_chan_restart[%d]: DELAYED due to md %p sts %x data %x, start_tx %x\n",
		    ch->channum, md,
		    le32_to_cpu(md->status),
		    le32_to_cpu(md->data), ch->ch_start_tx);
	    musycc_dump_txbuffer_ring(ch, 0);
#if 0
	    spin_unlock_irqrestore(&ch->ch_txlock, flags);   /* allow interrupts for service request */
#endif
	}
#endif
    }
}


 /*
  * Channel restart either fires of a workqueue request (2.6) or lodges a
  * watchdog activation sequence (2.4).
  */

void
musycc_chan_restart(mch_t *ch)
{
#ifdef RLD_RESTART_DEBUG
    pr_info("++ musycc_chan_restart[%d]: txd_irq_srv @ %p = sts %x\n",
	    ch->channum, ch->txd_irq_srv, ch->txd_irq_srv->status);
#endif

    /* 2.6 - find next unprocessed message, then set TX thp to it */
#ifdef RLD_RESTART_DEBUG
    pr_info(">> musycc_chan_restart: scheduling Chan %x workQ @ %p\n", ch->channum, &ch->ch_work);
#endif
    c4_wk_chan_restart(ch);        /* work queue mechanism fires off: Ref:
				     * musycc_wq_chan_restart () */

}


void
rld_put_led(mpi_t *pi, u_int32_t ledval)
{
    static u_int32_t led = 0;

    if (ledval == 0)
	led = 0;
    else
	led |= ledval;

    pci_write_32((u_int32_t *) &pi->up->cpldbase->leds, led);  /* RLD DEBUG TRANHANG */
}


#define MUSYCC_SR_RETRY_CNT  9

void
musycc_serv_req(mpi_t *pi, u_int32_t req)
{
    volatile u_int32_t r;
    int         rcnt;

    /*
     * PORT NOTE: Semaphore protect service loop guarantees only a single
     * operation at a time.  Per MUSYCC Manual - "Issuing service requests to
     * the same channel group without first receiving ACK from each request
     * may cause the host to lose track of which service request has been
     * acknowledged."
     */

    SD_SEM_TAKE(&pi->sr_sem_busy, "serv");     /* only 1 thru here, per
						 * group */

    if (pi->sr_last == req) {
#ifdef RLD_TRANS_DEBUG
	pr_info(">> same SR, Port %d Req %x\n", pi->portnum, req);
#endif

	/*
	 * The most likely repeated request is the channel activation command
	 * which follows the occurrence of a Transparent mode TX ONR or a
	 * BUFF error.  If the previous command was a CHANNEL ACTIVATE,
	 * precede it with a NOOP command in order maintain coherent control
	 * of this current (re)ACTIVATE.
	 */

	r = (pi->sr_last & ~SR_GCHANNEL_MASK);
	if ((r == (SR_CHANNEL_ACTIVATE | SR_TX_DIRECTION)) ||
	    (r == (SR_CHANNEL_ACTIVATE | SR_RX_DIRECTION))) {
#ifdef RLD_TRANS_DEBUG
	    pr_info(">> same CHAN ACT SR, Port %d Req %x => issue SR_NOOP CMD\n", pi->portnum, req);
#endif
	    SD_SEM_GIVE(&pi->sr_sem_busy);     /* allow this next request */
	    musycc_serv_req(pi, SR_NOOP);
	    SD_SEM_TAKE(&pi->sr_sem_busy, "serv");     /* relock & continue w/
							 * original req */
	} else if (req == SR_NOOP) {
	    /* no need to issue back-to-back SR_NOOP commands at this time */
#ifdef RLD_TRANS_DEBUG
	    pr_info(">> same Port SR_NOOP skipped, Port %d\n", pi->portnum);
#endif
	    SD_SEM_GIVE(&pi->sr_sem_busy);     /* allow this next request */
	    return;
	}
    }
    rcnt = 0;
    pi->sr_last = req;
rewrite:
    pci_write_32((u_int32_t *) &pi->reg->srd, req);
    FLUSH_MEM_WRITE();

    /*
     * Per MUSYCC Manual, Section 6.1,2 - "When writing an SCR service
     * request, the host must ensure at least one PCI bus clock cycle has
     * elapsed before writing another service request.  To meet this minimum
     * elapsed service request write timing interval, it is recommended that
     * the host follow any SCR write with another operation which reads from
     * the same address."
     */
    r = pci_read_32((u_int32_t *) &pi->reg->srd);      /* adhere to write
							 * timing imposition */


    if ((r != req) && (req != SR_CHIP_RESET) && (++rcnt <= MUSYCC_SR_RETRY_CNT)) {
	if (cxt1e1_log_level >= LOG_MONITOR)
	    pr_info("%s: %d - reissue srv req/last %x/%x (hdw reads %x), Chan %d.\n",
		    pi->up->devname, rcnt, req, pi->sr_last, r,
		    (pi->portnum * MUSYCC_NCHANS) + (req & 0x1f));
	OS_uwait_dummy();          /* this delay helps reduce reissue counts
				     * (reason not yet researched) */
	goto rewrite;
    }
    if (rcnt > MUSYCC_SR_RETRY_CNT) {
	pr_warning("%s: failed service request (#%d)= %x, group %d.\n",
		   pi->up->devname, MUSYCC_SR_RETRY_CNT, req, pi->portnum);
	SD_SEM_GIVE(&pi->sr_sem_busy); /* allow any next request */
	return;
    }
    if (req == SR_CHIP_RESET) {
	/*
	 * PORT NOTE: the CHIP_RESET command is NOT ack'd by the MUSYCC, thus
	 * the upcoming delay is used.  Though the MUSYCC documentation
	 * suggests a read-after-write would supply the required delay, it's
	 * unclear what CPU/BUS clock speeds might have been assumed when
	 * suggesting this 'lack of ACK' workaround.  Thus the use of uwait.
	 */
	OS_uwait(100000, "icard"); /* 100ms */
    } else {
	FLUSH_MEM_READ();
	SD_SEM_TAKE(&pi->sr_sem_wait, "sakack");       /* sleep until SACK
							 * interrupt occurs */
    }
    SD_SEM_GIVE(&pi->sr_sem_busy); /* allow any next request */
}


#ifdef  SBE_PMCC4_ENABLE
void
musycc_update_timeslots(mpi_t *pi)
{
    int         i, ch;
    char        e1mode = IS_FRAME_ANY_E1(pi->p.port_mode);

    for (i = 0; i < 32; i++) {
	int         usedby = 0, last = 0, ts, j, bits[8];

	u_int8_t lastval = 0;

	if (((i == 0) && e1mode) || /* disable if  E1 mode */
	    ((i == 16) && ((pi->p.port_mode == CFG_FRAME_E1CRC_CAS) || (pi->p.port_mode == CFG_FRAME_E1CRC_CAS_AMI)))
	    || ((i > 23) && (!e1mode))) /* disable if T1 mode */
	    pi->tsm[i] = 0xff;      /* make tslot unavailable for this mode */
	else
	    pi->tsm[i] = 0x00;      /* make tslot available for assignment */
	for (j = 0; j < 8; j++)
	    bits[j] = -1;
	for (ch = 0; ch < MUSYCC_NCHANS; ch++) {
	    if ((pi->chan[ch]->state == UP) && (pi->chan[ch]->p.bitmask[i])) {
		usedby++;
		last = ch;
		lastval = pi->chan[ch]->p.bitmask[i];
		for (j = 0; j < 8; j++)
		    if (lastval & (1 << j))
			bits[j] = ch;
		pi->tsm[i] |= lastval;
	    }
	}
	if (!usedby)
	    ts = 0;
	else if ((usedby == 1) && (lastval == 0xff))
	    ts = (4 << 5) | last;
	else if ((usedby == 1) && (lastval == 0x7f))
	    ts = (5 << 5) | last;
	else {
	    int         idx;

	    if (bits[0] < 0)
		ts = (6 << 5) | (idx = last);
	    else
		ts = (7 << 5) | (idx = bits[0]);
	    for (j = 1; j < 8; j++) {
		pi->regram->rscm[idx * 8 + j] = (bits[j] < 0) ? 0 : (0x80 | bits[j]);
		pi->regram->tscm[idx * 8 + j] = (bits[j] < 0) ? 0 : (0x80 | bits[j]);
	    }
	}
	pi->regram->rtsm[i] = ts;
	pi->regram->ttsm[i] = ts;
    }
    FLUSH_MEM_WRITE();

    musycc_serv_req(pi, SR_TIMESLOT_MAP | SR_RX_DIRECTION);
    musycc_serv_req(pi, SR_TIMESLOT_MAP | SR_TX_DIRECTION);
    musycc_serv_req(pi, SR_SUBCHANNEL_MAP | SR_RX_DIRECTION);
    musycc_serv_req(pi, SR_SUBCHANNEL_MAP | SR_TX_DIRECTION);
}
#endif


#ifdef SBE_WAN256T3_ENABLE
void
musycc_update_timeslots(mpi_t *pi)
{
    mch_t      *ch;

    u_int8_t    ts, hmask, tsen;
    int         gchan;
    int         i;

#ifdef SBE_PMCC4_ENABLE
    hmask = (0x1f << pi->up->p.hypersize) & 0x1f;
#endif
#ifdef SBE_WAN256T3_ENABLE
    hmask = (0x1f << hyperdummy) & 0x1f;
#endif
    for (i = 0; i < 128; i++) {
	gchan = ((pi->portnum * MUSYCC_NCHANS) + (i & hmask)) % MUSYCC_NCHANS;
	ch = pi->chan[gchan];
	if (ch->p.mode_56k)
	    tsen = MODE_56KBPS;
	else
	    tsen = MODE_64KBPS;     /* also the default */
	ts = ((pi->portnum % 4) == (i / 32)) ? (tsen << 5) | (i & hmask) : 0;
	pi->regram->rtsm[i] = ts;
	pi->regram->ttsm[i] = ts;
    }
    FLUSH_MEM_WRITE();
    musycc_serv_req(pi, SR_TIMESLOT_MAP | SR_RX_DIRECTION);
    musycc_serv_req(pi, SR_TIMESLOT_MAP | SR_TX_DIRECTION);
}
#endif


 /*
  * This routine converts a generic library channel configuration parameter
  * into a hardware specific register value (IE. MUSYCC CCD Register).
  */
u_int32_t
musycc_chan_proto(int proto)
{
    int         reg;

    switch (proto) {
    case CFG_CH_PROTO_TRANS:        /* 0 */
	reg = MUSYCC_CCD_TRANS;
	break;
    case CFG_CH_PROTO_SS7:          /* 1 */
	reg = MUSYCC_CCD_SS7;
	break;
    default:
    case CFG_CH_PROTO_ISLP_MODE:   /* 4 */
    case CFG_CH_PROTO_HDLC_FCS16:  /* 2 */
	reg = MUSYCC_CCD_HDLC_FCS16;
	break;
    case CFG_CH_PROTO_HDLC_FCS32:  /* 3 */
	reg = MUSYCC_CCD_HDLC_FCS32;
	break;
    }

    return reg;
}

#ifdef SBE_WAN256T3_ENABLE
static void __init
musycc_init_port(mpi_t *pi)
{
    pci_write_32((u_int32_t *) &pi->reg->gbp, OS_vtophys(pi->regram));

    pi->regram->grcd =
	__constant_cpu_to_le32(MUSYCC_GRCD_RX_ENABLE |
				MUSYCC_GRCD_TX_ENABLE |
				MUSYCC_GRCD_SF_ALIGN |
				MUSYCC_GRCD_SUBCHAN_DISABLE |
				MUSYCC_GRCD_OOFMP_DISABLE |
				MUSYCC_GRCD_COFAIRQ_DISABLE |
				MUSYCC_GRCD_MC_ENABLE |
		       (MUSYCC_GRCD_POLLTH_32 << MUSYCC_GRCD_POLLTH_SHIFT));

    pi->regram->pcd =
	__constant_cpu_to_le32(MUSYCC_PCD_E1X4_MODE |
				MUSYCC_PCD_TXDATA_RISING |
				MUSYCC_PCD_TX_DRIVEN);

    /* Message length descriptor */
       pi->regram->mld = __constant_cpu_to_le32(cxt1e1_max_mru | (cxt1e1_max_mru << 16));
    FLUSH_MEM_WRITE();

    musycc_serv_req(pi, SR_GROUP_INIT | SR_RX_DIRECTION);
    musycc_serv_req(pi, SR_GROUP_INIT | SR_TX_DIRECTION);

    musycc_init_mdt(pi);

    musycc_update_timeslots(pi);
}
#endif


status_t    __init
musycc_init(ci_t *ci)
{
    char       *regaddr;        /* temp for address boundary calculations */
    int         i, gchan;

    OS_sem_init(&ci->sem_wdbusy, SEM_AVAILABLE);       /* watchdog exclusion */

    /*
     * Per MUSYCC manual, Section 6.3.4 - "The host must allocate a dword
     * aligned memory segment for interrupt queue pointers."
     */

#define INT_QUEUE_BOUNDARY  4

    regaddr = OS_kmalloc((INT_QUEUE_SIZE + 1) * sizeof(u_int32_t));
    if (!regaddr)
	return -ENOMEM;
    ci->iqd_p_saved = regaddr;      /* save orig value for free's usage */
    ci->iqd_p = (u_int32_t *) ((unsigned long) (regaddr + INT_QUEUE_BOUNDARY - 1) &
			       (~(INT_QUEUE_BOUNDARY - 1)));    /* this calculates
								 * closest boundary */

    for (i = 0; i < INT_QUEUE_SIZE; i++)
	ci->iqd_p[i] = __constant_cpu_to_le32(INT_EMPTY_ENTRY);

    for (i = 0; i < ci->max_port; i++) {
	mpi_t      *pi = &ci->port[i];

	/*
	 * Per MUSYCC manual, Section 6.3.2 - "The host must allocate a 2KB
	 * bound memory segment for Channel Group 0."
	 */

#define GROUP_BOUNDARY   0x800

	regaddr = OS_kmalloc(sizeof(struct musycc_groupr) + GROUP_BOUNDARY);
	if (!regaddr) {
	    for (gchan = 0; gchan < i; gchan++) {
		pi = &ci->port[gchan];
		OS_kfree(pi->reg);
		pi->reg = NULL;
	    }
	    return -ENOMEM;
	}
	pi->regram_saved = regaddr; /* save orig value for free's usage */
	pi->regram = (struct musycc_groupr *) ((unsigned long) (regaddr + GROUP_BOUNDARY - 1) &
					       (~(GROUP_BOUNDARY - 1)));        /* this calculates
										 * closest boundary */
    }

    /* any board centric MUSYCC commands will use group ZERO as its "home" */
    ci->regram = ci->port[0].regram;
    musycc_serv_req(&ci->port[0], SR_CHIP_RESET);

    pci_write_32((u_int32_t *) &ci->reg->gbp, OS_vtophys(ci->regram));
    pci_flush_write(ci);
#ifdef CONFIG_SBE_PMCC4_NCOMM
    ci->regram->__glcd = __constant_cpu_to_le32(GCD_MAGIC);
#else
    /* standard driver POLLS for INTB via CPLD register */
    ci->regram->__glcd = __constant_cpu_to_le32(GCD_MAGIC | MUSYCC_GCD_INTB_DISABLE);
#endif

    ci->regram->__iqp = cpu_to_le32(OS_vtophys(&ci->iqd_p[0]));
    ci->regram->__iql = __constant_cpu_to_le32(INT_QUEUE_SIZE - 1);
    pci_write_32((u_int32_t *) &ci->reg->dacbp, 0);
    FLUSH_MEM_WRITE();

    ci->state = C_RUNNING;          /* mark as full interrupt processing
				     * available */

    musycc_serv_req(&ci->port[0], SR_GLOBAL_INIT);     /* FIRST INTERRUPT ! */

    /* sanity check settable parameters */

       if (cxt1e1_max_mru > 0xffe) {
	pr_warning("Maximum allowed MRU exceeded, resetting %d to %d.\n",
				  cxt1e1_max_mru, 0xffe);
	       cxt1e1_max_mru = 0xffe;
    }
       if (cxt1e1_max_mtu > 0xffe) {
	pr_warning("Maximum allowed MTU exceeded, resetting %d to %d.\n",
				  cxt1e1_max_mtu, 0xffe);
	       cxt1e1_max_mtu = 0xffe;
    }
#ifdef SBE_WAN256T3_ENABLE
    for (i = 0; i < MUSYCC_NPORTS; i++)
	musycc_init_port(&ci->port[i]);
#endif

    return SBE_DRVR_SUCCESS;        /* no error */
}


void
musycc_bh_tx_eom(mpi_t *pi, int gchan)
{
    mch_t      *ch;
    struct mdesc *md;

#if 0
#ifndef SBE_ISR_INLINE
    unsigned long flags;

#endif
#endif
    volatile u_int32_t status;

    ch = pi->chan[gchan];
    if (!ch || ch->state != UP) {
	if (cxt1e1_log_level >= LOG_ERROR)
	    pr_info("%s: intr: xmit EOM on uninitialized channel %d\n",
		    pi->up->devname, gchan);
    }
    if (!ch || !ch->mdt)
	return;                     /* note: mdt==0 implies a malloc()
				     * failure w/in chan_up() routine */

#if 0
#ifdef SBE_ISR_INLINE
    spin_lock_irq(&ch->ch_txlock);
#else
    spin_lock_irqsave(&ch->ch_txlock, flags);
#endif
#endif
    do {
	FLUSH_MEM_READ();
	md = ch->txd_irq_srv;
	status = le32_to_cpu(md->status);

	/*
	 * Note: Per MUSYCC Ref 6.4.9, the host does not poll a host-owned
	 * Transmit Buffer Descriptor during Transparent Mode.
	 */
	if (status & MUSYCC_TX_OWNED) {
	    int         readCount, loopCount;

	    /***********************************************************/
	    /* HW Bug Fix                                              */
	    /* ----------                                              */
	    /* Under certain PCI Bus loading conditions, the data      */
	    /* associated with an update of Shared Memory is delayed   */
	    /* relative to its PCI Interrupt.  This is caught when     */
	    /* the host determines it does not yet OWN the descriptor. */
	    /***********************************************************/

	    readCount = 0;
	    while (status & MUSYCC_TX_OWNED) {
		for (loopCount = 0; loopCount < 0x30; loopCount++)
		    OS_uwait_dummy();  /* use call to avoid optimization
					 * removal of dummy delay */
		FLUSH_MEM_READ();
		status = le32_to_cpu(md->status);
		if (readCount++ > 40)
		    break;          /* don't wait any longer */
	    }
	    if (status & MUSYCC_TX_OWNED) {
		if (cxt1e1_log_level >= LOG_MONITOR) {
		    pr_info("%s: Port %d Chan %2d - unexpected TX msg ownership intr (md %p sts %x)\n",
			    pi->up->devname, pi->portnum, ch->channum,
			    md, status);
		    pr_info("++ User 0x%p IRQ_SRV 0x%p USR_ADD 0x%p QStopped %x, start_tx %x tx_full %d txd_free %d mode %x\n",
			    ch->user, ch->txd_irq_srv, ch->txd_usr_add,
			    sd_queue_stopped(ch->user),
			    ch->ch_start_tx, ch->tx_full, ch->txd_free, ch->p.chan_mode);
		    musycc_dump_txbuffer_ring(ch, 0);
		}
		break;              /* Not our mdesc, done */
	    } else {
		if (cxt1e1_log_level >= LOG_MONITOR)
		    pr_info("%s: Port %d Chan %2d - recovered TX msg ownership [%d] (md %p sts %x)\n",
			    pi->up->devname, pi->portnum, ch->channum, readCount, md, status);
	    }
	}
	ch->txd_irq_srv = md->snext;

	md->data = 0;
	if (md->mem_token)	{
	    /* upcount channel */
	    atomic_sub(OS_mem_token_tlen(md->mem_token), &ch->tx_pending);
	    /* upcount card */
	    atomic_sub(OS_mem_token_tlen(md->mem_token), &pi->up->tx_pending);
#ifdef SBE_WAN256T3_ENABLE
	    if (!atomic_read(&pi->up->tx_pending))
		wan256t3_led(pi->up, LED_TX, 0);
#endif

#ifdef CONFIG_SBE_WAN256T3_NCOMM
	    /* callback that our packet was sent */
	    {
		int         hdlcnum = (pi->portnum * 32 + gchan);

		if (hdlcnum >= 228) {
		    if (nciProcess_TX_complete)
			(*nciProcess_TX_complete) (hdlcnum,
						   getuserbychan(gchan));
		}
	    }
#endif                              /*** CONFIG_SBE_WAN256T3_NCOMM ***/

	    OS_mem_token_free_irq(md->mem_token);
	    md->mem_token = NULL;
	}
	md->status = 0;
#ifdef RLD_TXFULL_DEBUG
	if (cxt1e1_log_level >= LOG_MONITOR2)
	    pr_info("~~ tx_eom: tx_full %x  txd_free %d -> %d\n",
		    ch->tx_full, ch->txd_free, ch->txd_free + 1);
#endif
	++ch->txd_free;
	FLUSH_MEM_WRITE();

	if ((ch->p.chan_mode != CFG_CH_PROTO_TRANS) && (status & EOBIRQ_ENABLE)) {
	    if (cxt1e1_log_level >= LOG_MONITOR)
		pr_info("%s: Mode (%x) incorrect EOB status (%x)\n",
			pi->up->devname, ch->p.chan_mode, status);
	    if ((status & EOMIRQ_ENABLE) == 0)
		break;
	}
    } while ((ch->p.chan_mode != CFG_CH_PROTO_TRANS) && ((status & EOMIRQ_ENABLE) == 0));
    /*
     * NOTE: (The above 'while' is coupled w/ previous 'do', way above.) Each
     * Transparent data buffer has the EOB bit, and NOT the EOM bit, set and
     * will furthermore have a separate IQD associated with each messages
     * buffer.
     */

    FLUSH_MEM_READ();
    /*
     * Smooth flow control hysterisis by maintaining task stoppage until half
     * the available write buffers are available.
     */
    if (ch->tx_full && (ch->txd_free >= (ch->txd_num / 2))) {
	/*
	 * Then, only releave task stoppage if we actually have enough
	 * buffers to service the last requested packet.  It may require MORE
	 * than half the available!
	 */
	if (ch->txd_free >= ch->txd_required) {

#ifdef RLD_TXFULL_DEBUG
	    if (cxt1e1_log_level >= LOG_MONITOR2)
		pr_info("tx_eom[%d]: enable xmit tx_full no more, txd_free %d txd_num/2 %d\n",
			ch->channum,
			ch->txd_free, ch->txd_num / 2);
#endif
	    ch->tx_full = 0;
	    ch->txd_required = 0;
	    sd_enable_xmit(ch->user);  /* re-enable to catch flow controlled
					 * channel */
	}
    }
#ifdef RLD_TXFULL_DEBUG
    else if (ch->tx_full) {
	if (cxt1e1_log_level >= LOG_MONITOR2)
	    pr_info("tx_eom[%d]: bypass TX enable though room available? (txd_free %d txd_num/2 %d)\n",
		    ch->channum,
		    ch->txd_free, ch->txd_num / 2);
    }
#endif

    FLUSH_MEM_WRITE();
#if 0
#ifdef SBE_ISR_INLINE
    spin_unlock_irq(&ch->ch_txlock);
#else
    spin_unlock_irqrestore(&ch->ch_txlock, flags);
#endif
#endif
}


static void
musycc_bh_rx_eom(mpi_t *pi, int gchan)
{
    mch_t      *ch;
    void       *m, *m2;
    struct mdesc *md;
    volatile u_int32_t status;
    u_int32_t   error;

    ch = pi->chan[gchan];
    if (!ch || ch->state != UP) {
	if (cxt1e1_log_level > LOG_ERROR)
	    pr_info("%s: intr: receive EOM on uninitialized channel %d\n",
		    pi->up->devname, gchan);
	return;
    }
    if (!ch->mdr)
	return;                     /* can this happen ? */

    for (;;) {
	FLUSH_MEM_READ();
	md = &ch->mdr[ch->rxix_irq_srv];
	status = le32_to_cpu(md->status);
	if (!(status & HOST_RX_OWNED))
	    break;                  /* Not our mdesc, done */
	m = md->mem_token;
	error = (status >> 16) & 0xf;
	if (error == 0) {
#ifdef CONFIG_SBE_WAN256T3_NCOMM
	    int         hdlcnum = (pi->portnum * 32 + gchan);

	    /*
	     * if the packet number belongs to NCOMM, then send it to the TMS
	     * driver
	     */
	    if (hdlcnum >= 228) {
		if (nciProcess_RX_packet)
		    (*nciProcess_RX_packet) (hdlcnum, status & 0x3fff, m, ch->user);
	    } else
#endif                              /*** CONFIG_SBE_WAN256T3_NCOMM ***/

	    {
		if ((m2 = OS_mem_token_alloc(cxt1e1_max_mru))) {
		    /* substitute the mbuf+cluster */
		    md->mem_token = m2;
		    md->data = cpu_to_le32(OS_vtophys(OS_mem_token_data(m2)));

		    /* pass the received mbuf upward */
		    sd_recv_consume(m, status & LENGTH_MASK, ch->user);
		    ch->s.rx_packets++;
		    ch->s.rx_bytes += status & LENGTH_MASK;
		} else
		    ch->s.rx_dropped++;
	    }
	} else if (error == ERR_FCS)
	    ch->s.rx_crc_errors++;
	else if (error == ERR_ALIGN)
	    ch->s.rx_missed_errors++;
	else if (error == ERR_ABT)
	    ch->s.rx_missed_errors++;
	else if (error == ERR_LNG)
	    ch->s.rx_length_errors++;
	else if (error == ERR_SHT)
	    ch->s.rx_length_errors++;
	FLUSH_MEM_WRITE();
	       status = cxt1e1_max_mru;
	if (ch->p.chan_mode == CFG_CH_PROTO_TRANS)
	    status |= EOBIRQ_ENABLE;
	md->status = cpu_to_le32(status);

	/* Check next mdesc in the ring */
	if (++ch->rxix_irq_srv >= ch->rxd_num)
	    ch->rxix_irq_srv = 0;
	FLUSH_MEM_WRITE();
    }
}


irqreturn_t
musycc_intr_th_handler(void *devp)
{
    ci_t       *ci = (ci_t *) devp;
    volatile u_int32_t status, currInt = 0;
    u_int32_t   nextInt, intCnt;

    /*
     * Hardware not available, potential interrupt hang.  But since interrupt
     * might be shared, just return.
     */
    if (ci->state == C_INIT)
	return IRQ_NONE;
    /*
     * Marked as hardware available. Don't service interrupts, just clear the
     * event.
     */

    if (ci->state == C_IDLE) {
	status = pci_read_32((u_int32_t *) &ci->reg->isd);

	/* clear the interrupt but process nothing else */
	pci_write_32((u_int32_t *) &ci->reg->isd, status);
	return IRQ_HANDLED;
    }
    FLUSH_PCI_READ();
    FLUSH_MEM_READ();

    status = pci_read_32((u_int32_t *) &ci->reg->isd);
    nextInt = INTRPTS_NEXTINT(status);
    intCnt = INTRPTS_INTCNT(status);
    ci->intlog.drvr_intr_thcount++;

    /*********************************************************/
    /* HW Bug Fix                                            */
    /* ----------                                            */
    /* Under certain PCI Bus loading conditions, the         */
    /* MUSYCC looses the data associated with an update      */
    /* of its ISD and erroneously returns the immediately    */
    /* preceding 'nextInt' value.  However, the 'intCnt'     */
    /* value appears to be correct.  By not starting service */
    /* where the 'missing' 'nextInt' SHOULD point causes     */
    /* the IQD not to be serviced - the 'not serviced'       */
    /* entries then remain and continue to increase as more  */
    /* incorrect ISD's are encountered.                      */
    /*********************************************************/

    if (nextInt != INTRPTS_NEXTINT(ci->intlog.this_status_new)) {
	if (cxt1e1_log_level >= LOG_MONITOR) {
	    pr_info("%s: note - updated ISD from %08x to %08x\n",
		    ci->devname, status,
	      (status & (~INTRPTS_NEXTINT_M)) | ci->intlog.this_status_new);
	}
	/*
	 * Replace bogus status with software corrected value.
	 *
	 * It's not known whether, during this problem occurrence, if the
	 * INTFULL bit is correctly reported or not.
	 */
	status = (status & (~INTRPTS_NEXTINT_M)) | (ci->intlog.this_status_new);
	nextInt = INTRPTS_NEXTINT(status);
    }
    /**********************************************/
    /* Cn847x Bug Fix                             */
    /* --------------                             */
    /* Fix for inability to write back same index */
    /* as read for a full interrupt queue.        */
    /**********************************************/

    if (intCnt == INT_QUEUE_SIZE)
	currInt = ((intCnt - 1) + nextInt) & (INT_QUEUE_SIZE - 1);
    else
	/************************************************/
	/* Interrupt Write Location Issues              */
	/* -------------------------------              */
	/* When the interrupt status descriptor is      */
	/* written, the interrupt line is de-asserted   */
	/* by the Cn847x.  In the case of MIPS          */
	/* microprocessors, this must occur at the      */
	/* beginning of the interrupt handler so that   */
	/* the interrupt handle is not re-entered due   */
	/* to interrupt dis-assertion latency.          */
	/* In the case of all other processors, this    */
	/* action should occur at the end of the        */
	/* interrupt handler to avoid overwriting the   */
	/* interrupt queue.                             */
	/************************************************/

    if (intCnt)
	currInt = (intCnt + nextInt) & (INT_QUEUE_SIZE - 1);
    else {
	/*
	 * NOTE: Servicing an interrupt whose ISD contains a count of ZERO
	 * can be indicative of a Shared Interrupt chain.  Our driver can be
	 * called from the system's interrupt handler as a matter of the OS
	 * walking the chain.  As the chain is walked, the interrupt will
	 * eventually be serviced by the correct driver/handler.
	 */
#if 0
	/* chained interrupt = not ours */
	pr_info(">> %s: intCnt NULL, sts %x, possibly a chained interrupt!\n",
		ci->devname, status);
#endif
	return IRQ_NONE;
    }

    ci->iqp_tailx = currInt;

    currInt <<= INTRPTS_NEXTINT_S;
    ci->intlog.last_status_new = ci->intlog.this_status_new;
    ci->intlog.this_status_new = currInt;

    if ((cxt1e1_log_level >= LOG_WARN) && (status & INTRPTS_INTFULL_M))
	pr_info("%s: Interrupt queue full condition occurred\n", ci->devname);
    if (cxt1e1_log_level >= LOG_DEBUG)
	pr_info("%s: interrupts pending, isd @ 0x%p: %x curr %d cnt %d NEXT %d\n",
		ci->devname, &ci->reg->isd,
	status, nextInt, intCnt, (intCnt + nextInt) & (INT_QUEUE_SIZE - 1));

    FLUSH_MEM_WRITE();
#if defined(SBE_ISR_TASKLET)
    pci_write_32((u_int32_t *) &ci->reg->isd, currInt);
    atomic_inc(&ci->bh_pending);
    tasklet_schedule(&ci->ci_musycc_isr_tasklet);
#elif defined(SBE_ISR_IMMEDIATE)
    pci_write_32((u_int32_t *) &ci->reg->isd, currInt);
    atomic_inc(&ci->bh_pending);
    queue_task(&ci->ci_musycc_isr_tq, &tq_immediate);
    mark_bh(IMMEDIATE_BH);
#elif defined(SBE_ISR_INLINE)
    (void) musycc_intr_bh_tasklet(ci);
    pci_write_32((u_int32_t *) &ci->reg->isd, currInt);
#endif
    return IRQ_HANDLED;
}


#if defined(SBE_ISR_IMMEDIATE)
unsigned long
#else
void
#endif
musycc_intr_bh_tasklet(ci_t *ci)
{
    mpi_t      *pi;
    mch_t      *ch;
    unsigned int intCnt;
    volatile u_int32_t currInt = 0;
    volatile unsigned int headx, tailx;
    int         readCount, loopCount;
    int         group, gchan, event, err, tx;
    u_int32_t   badInt = INT_EMPTY_ENTRY;
    u_int32_t   badInt2 = INT_EMPTY_ENTRY2;

    /*
     * Hardware not available, potential interrupt hang.  But since interrupt
     * might be shared, just return.
     */
    if ((drvr_state != SBE_DRVR_AVAILABLE) || (ci->state == C_INIT)) {
#if defined(SBE_ISR_IMMEDIATE)
	return 0L;
#else
	return;
#endif
    }
#if defined(SBE_ISR_TASKLET) || defined(SBE_ISR_IMMEDIATE)
    if (drvr_state != SBE_DRVR_AVAILABLE) {
#if defined(SBE_ISR_TASKLET)
	return;
#elif defined(SBE_ISR_IMMEDIATE)
	return 0L;
#endif
    }
#elif defined(SBE_ISR_INLINE)
    /* no semaphore taken, no double checks */
#endif

    ci->intlog.drvr_intr_bhcount++;
    FLUSH_MEM_READ();
    {
	unsigned int bh = atomic_read(&ci->bh_pending);

	max_bh = max(bh, max_bh);
    }
    atomic_set(&ci->bh_pending, 0);/* if here, no longer pending */
    while ((headx = ci->iqp_headx) != (tailx = ci->iqp_tailx)) {
	intCnt = (tailx >= headx) ? (tailx - headx) : (tailx - headx + INT_QUEUE_SIZE);
	currInt = le32_to_cpu(ci->iqd_p[headx]);

	max_intcnt = max(intCnt, max_intcnt);  /* RLD DEBUG */

	/**************************************************/
	/* HW Bug Fix                                     */
	/* ----------                                     */
	/* The following code checks for the condition    */
	/* of interrupt assertion before interrupt        */
	/* queue update.  This is a problem on several    */
	/* PCI-Local bridge chips found on some products. */
	/**************************************************/

	readCount = 0;
	if ((currInt == badInt) || (currInt == badInt2))
	    ci->intlog.drvr_int_failure++;

	while ((currInt == badInt) || (currInt == badInt2)) {
	    for (loopCount = 0; loopCount < 0x30; loopCount++)
		OS_uwait_dummy();  /* use call to avoid optimization removal
				     * of dummy delay */
	    FLUSH_MEM_READ();
	    currInt = le32_to_cpu(ci->iqd_p[headx]);
	    if (readCount++ > 20)
		break;
	}

	if ((currInt == badInt) || (currInt == badInt2)) {      /* catch failure of Bug
								 * Fix checking */
	    if (cxt1e1_log_level >= LOG_WARN)
		pr_info("%s: Illegal Interrupt Detected @ 0x%p, mod %d.)\n",
			ci->devname, &ci->iqd_p[headx], headx);

	    /*
	     * If the descriptor has not recovered, then leaving the EMPTY
	     * entry set will not signal to the MUSYCC that this descriptor
	     * has been serviced. The Interrupt Queue can then start losing
	     * available descriptors and MUSYCC eventually encounters and
	     * reports the INTFULL condition.  Per manual, changing any bit
	     * marks descriptor as available, thus the use of different
	     * EMPTY_ENTRY values.
	     */

	    if (currInt == badInt)
		ci->iqd_p[headx] = __constant_cpu_to_le32(INT_EMPTY_ENTRY2);
	    else
		ci->iqd_p[headx] = __constant_cpu_to_le32(INT_EMPTY_ENTRY);
	    ci->iqp_headx = (headx + 1) & (INT_QUEUE_SIZE - 1); /* insure wrapness */
	    FLUSH_MEM_WRITE();
	    FLUSH_MEM_READ();
	    continue;
	}
	group = INTRPT_GRP(currInt);
	gchan = INTRPT_CH(currInt);
	event = INTRPT_EVENT(currInt);
	err = INTRPT_ERROR(currInt);
	tx = currInt & INTRPT_DIR_M;

	ci->iqd_p[headx] = __constant_cpu_to_le32(INT_EMPTY_ENTRY);
	FLUSH_MEM_WRITE();

	if (cxt1e1_log_level >= LOG_DEBUG) {
	    if (err != 0)
		pr_info(" %08x -> err: %2d,", currInt, err);

	    pr_info("+ interrupt event: %d, grp: %d, chan: %2d, side: %cX\n",
		    event, group, gchan, tx ? 'T' : 'R');
	}
	pi = &ci->port[group];      /* notice that here we assume 1-1 group -
				     * port mapping */
	ch = pi->chan[gchan];
	switch (event) {
	case EVE_SACK:              /* Service Request Acknowledge */
	    if (cxt1e1_log_level >= LOG_DEBUG) {
		volatile u_int32_t r;

		r = pci_read_32((u_int32_t *) &pi->reg->srd);
		pr_info("- SACK cmd: %08x (hdw= %08x)\n", pi->sr_last, r);
	    }
	    SD_SEM_GIVE(&pi->sr_sem_wait);     /* wake up waiting process */
	    break;
	case EVE_CHABT:     /* Change To Abort Code (0x7e -> 0xff) */
	case EVE_CHIC:              /* Change To Idle Code (0xff -> 0x7e) */
	    break;
	case EVE_EOM:               /* End Of Message */
	case EVE_EOB:               /* End Of Buffer (Transparent mode) */
	    if (tx)
		musycc_bh_tx_eom(pi, gchan);
	    else
		musycc_bh_rx_eom(pi, gchan);
#if 0
	    break;
#else
	    /*
	     * MUSYCC Interrupt Descriptor section states that EOB and EOM
	     * can be combined with the NONE error (as well as others).  So
	     * drop thru to catch this...
	     */
#endif
	case EVE_NONE:
	    if (err == ERR_SHT)
		ch->s.rx_length_errors++;
	    break;
	default:
	    if (cxt1e1_log_level >= LOG_WARN)
		pr_info("%s: unexpected interrupt event: %d, iqd[%d]: %08x, port: %d\n", ci->devname,
			event, headx, currInt, group);
	    break;
	}                           /* switch on event */


	/*
	 * Per MUSYCC Manual, Section 6.4.8.3 [Transmit Errors], TX errors
	 * are service-affecting and require action to resume normal
	 * bit-level processing.
	 */

	switch (err) {
	case ERR_ONR:
	    /*
	     * Per MUSYCC manual, Section  6.4.8.3 [Transmit Errors], this
	     * error requires Transmit channel reactivation.
	     *
	     * Per MUSYCC manual, Section  6.4.8.4 [Receive Errors], this error
	     * requires Receive channel reactivation.
	     */
	    if (tx) {

		/*
		 * TX ONR Error only occurs when channel is configured for
		 * Transparent Mode.  However, this code will catch and
		 * re-activate on ANY TX ONR error.
		 */

		/*
		 * Set flag to re-enable on any next transmit attempt.
		 */
		ch->ch_start_tx = CH_START_TX_ONR;

		{
#ifdef RLD_TRANS_DEBUG
		    if (1 || cxt1e1_log_level >= LOG_MONITOR)
#else
		    if (cxt1e1_log_level >= LOG_MONITOR)
#endif
		    {
			pr_info("%s: TX buffer underflow [ONR] on channel %d, mode %x QStopped %x free %d\n",
				ci->devname, ch->channum, ch->p.chan_mode, sd_queue_stopped(ch->user), ch->txd_free);
#ifdef RLD_DEBUG
			if (ch->p.chan_mode == 2) {     /* problem = ONR on HDLC
							 * mode */
			    pr_info("++ Failed Last %x Next %x QStopped %x, start_tx %x tx_full %d txd_free %d mode %x\n",
				    (u_int32_t) ch->txd_irq_srv, (u_int32_t) ch->txd_usr_add,
				    sd_queue_stopped(ch->user),
				    ch->ch_start_tx, ch->tx_full, ch->txd_free, ch->p.chan_mode);
			    musycc_dump_txbuffer_ring(ch, 0);
			}
#endif
		    }
		}
	    } else {                 /* RX buffer overrun */
		/*
		 * Per MUSYCC manual, Section 6.4.8.4 [Receive Errors],
		 * channel recovery for this RX ONR error IS required.  It is
		 * also suggested to increase the number of receive buffers
		 * for this channel.  Receive channel reactivation IS
		 * required, and data has been lost.
		 */
		ch->s.rx_over_errors++;
		ch->ch_start_rx = CH_START_RX_ONR;

		if (cxt1e1_log_level >= LOG_WARN) {
		    pr_info("%s: RX buffer overflow [ONR] on channel %d, mode %x\n",
			    ci->devname, ch->channum, ch->p.chan_mode);
		    //musycc_dump_rxbuffer_ring (ch, 0);        /* RLD DEBUG */
		}
	    }
	    musycc_chan_restart(ch);
	    break;
	case ERR_BUF:
	    if (tx) {
		ch->s.tx_fifo_errors++;
		ch->ch_start_tx = CH_START_TX_BUF;
		/*
		 * Per MUSYCC manual, Section  6.4.8.3 [Transmit Errors],
		 * this BUFF error requires Transmit channel reactivation.
		 */
		if (cxt1e1_log_level >= LOG_MONITOR)
		    pr_info("%s: TX buffer underrun [BUFF] on channel %d, mode %x\n",
			    ci->devname, ch->channum, ch->p.chan_mode);
	    } else {                 /* RX buffer overrun */
		ch->s.rx_over_errors++;
		/*
		 * Per MUSYCC manual, Section 6.4.8.4 [Receive Errors], HDLC
		 * mode requires NO recovery for this RX BUFF error is
		 * required.  It is suggested to increase the FIFO buffer
		 * space for this channel.  Receive channel reactivation is
		 * not required, but data has been lost.
		 */
		if (cxt1e1_log_level >= LOG_WARN)
		    pr_info("%s: RX buffer overrun [BUFF] on channel %d, mode %x\n",
			    ci->devname, ch->channum, ch->p.chan_mode);
		/*
		 * Per MUSYCC manual, Section 6.4.9.4 [Receive Errors],
		 * Transparent mode DOES require recovery for the RX BUFF
		 * error.  It is suggested to increase the FIFO buffer space
		 * for this channel.  Receive channel reactivation IS
		 * required and data has been lost.
		 */
		if (ch->p.chan_mode == CFG_CH_PROTO_TRANS)
		    ch->ch_start_rx = CH_START_RX_BUF;
	    }

	    if (tx || (ch->p.chan_mode == CFG_CH_PROTO_TRANS))
		musycc_chan_restart(ch);
	    break;
	default:
	    break;
	}                           /* switch on err */

	/* Check for interrupt lost condition */
	if ((currInt & INTRPT_ILOST_M) && (cxt1e1_log_level >= LOG_ERROR))
	    pr_info("%s: Interrupt queue overflow - ILOST asserted\n",
		    ci->devname);
	ci->iqp_headx = (headx + 1) & (INT_QUEUE_SIZE - 1);     /* insure wrapness */
	FLUSH_MEM_WRITE();
	FLUSH_MEM_READ();
    }                               /* while */
    if ((cxt1e1_log_level >= LOG_MONITOR2) && (ci->iqp_headx != ci->iqp_tailx)) {
	int         bh;

	bh = atomic_read(&CI->bh_pending);
	pr_info("_bh_: late arrivals, head %d != tail %d, pending %d\n",
		ci->iqp_headx, ci->iqp_tailx, bh);
    }
#if defined(SBE_ISR_IMMEDIATE)
    return 0L;
#endif
    /* else, nothing returned */
}

#if 0
int         __init
musycc_new_chan(ci_t *ci, int channum, void *user)
{
    mch_t      *ch;

    ch = ci->port[channum / MUSYCC_NCHANS].chan[channum % MUSYCC_NCHANS];

    if (ch->state != UNASSIGNED)
	return EEXIST;
    /* NOTE: mch_t already cleared during OS_kmalloc() */
    ch->state = DOWN;
    ch->user = user;
#if 0
    ch->status = 0;
    ch->p.status = 0;
    ch->p.intr_mask = 0;
#endif
    ch->p.chan_mode = CFG_CH_PROTO_HDLC_FCS16;
    ch->p.idlecode = CFG_CH_FLAG_7E;
    ch->p.pad_fill_count = 2;
    spin_lock_init(&ch->ch_rxlock);
    spin_lock_init(&ch->ch_txlock);

    return 0;
}
#endif


#ifdef SBE_PMCC4_ENABLE
status_t
musycc_chan_down(ci_t *dummy, int channum)
{
    mpi_t      *pi;
    mch_t      *ch;
    int         i, gchan;

    if (!(ch = sd_find_chan(dummy, channum)))
	return EINVAL;
    pi = ch->up;
    gchan = ch->gchan;

    /* Deactivate the channel */
    musycc_serv_req(pi, SR_CHANNEL_DEACTIVATE | SR_RX_DIRECTION | gchan);
    ch->ch_start_rx = 0;
    musycc_serv_req(pi, SR_CHANNEL_DEACTIVATE | SR_TX_DIRECTION | gchan);
    ch->ch_start_tx = 0;

    if (ch->state == DOWN)
	return 0;
    ch->state = DOWN;

    pi->regram->thp[gchan] = 0;
    pi->regram->tmp[gchan] = 0;
    pi->regram->rhp[gchan] = 0;
    pi->regram->rmp[gchan] = 0;
    FLUSH_MEM_WRITE();
    for (i = 0; i < ch->txd_num; i++)
	if (ch->mdt[i].mem_token)
	    OS_mem_token_free(ch->mdt[i].mem_token);

    for (i = 0; i < ch->rxd_num; i++)
	if (ch->mdr[i].mem_token)
	    OS_mem_token_free(ch->mdr[i].mem_token);

    OS_kfree(ch->mdr);
    ch->mdr = NULL;
    ch->rxd_num = 0;
    OS_kfree(ch->mdt);
    ch->mdt = NULL;
    ch->txd_num = 0;

    musycc_update_timeslots(pi);
    c4_fifo_free(pi, ch->gchan);

    pi->openchans--;
    return 0;
}
#endif


int
musycc_del_chan(ci_t *ci, int channum)
{
    mch_t      *ch;

    if ((channum < 0) || (channum >= (MUSYCC_NPORTS * MUSYCC_NCHANS)))  /* sanity chk param */
	return ECHRNG;
    if (!(ch = sd_find_chan(ci, channum)))
	return ENOENT;
    if (ch->state == UP)
	musycc_chan_down(ci, channum);
    ch->state = UNASSIGNED;
    return 0;
}


int
musycc_del_chan_stats(ci_t *ci, int channum)
{
    mch_t      *ch;

    if (channum < 0 || channum >= (MUSYCC_NPORTS * MUSYCC_NCHANS))      /* sanity chk param */
	return ECHRNG;
    if (!(ch = sd_find_chan(ci, channum)))
	return ENOENT;

    memset(&ch->s, 0, sizeof(struct sbecom_chan_stats));
    return 0;
}


int
musycc_start_xmit(ci_t *ci, int channum, void *mem_token)
{
    mch_t      *ch;
    struct mdesc *md;
    void       *m2;
#if 0
    unsigned long flags;
#endif
    int         txd_need_cnt;
    u_int32_t   len;

    if (!(ch = sd_find_chan(ci, channum)))
	return -ENOENT;

    if (ci->state != C_RUNNING)     /* full interrupt processing available */
	return -EINVAL;
    if (ch->state != UP)
	return -EINVAL;

    if (!(ch->status & TX_ENABLED))
	return -EROFS;               /* how else to flag unwritable state ? */

#ifdef RLD_TRANS_DEBUGx
    if (1 || cxt1e1_log_level >= LOG_MONITOR2)
#else
    if (cxt1e1_log_level >= LOG_MONITOR2)
#endif
    {
	pr_info("++ start_xmt[%d]: state %x start %x full %d free %d required %d stopped %x\n",
		channum, ch->state, ch->ch_start_tx, ch->tx_full,
		ch->txd_free, ch->txd_required, sd_queue_stopped(ch->user));
    }
    /***********************************************/
    /** Determine total amount of data to be sent **/
    /***********************************************/
    m2 = mem_token;
    txd_need_cnt = 0;
    for (len = OS_mem_token_tlen(m2); len > 0;
	 m2 = (void *) OS_mem_token_next(m2)) {
	if (!OS_mem_token_len(m2))
	    continue;
	txd_need_cnt++;
	len -= OS_mem_token_len(m2);
    }

    if (txd_need_cnt == 0) {
	if (cxt1e1_log_level >= LOG_MONITOR2)
	    pr_info("%s channel %d: no TX data in User buffer\n", ci->devname, channum);
	OS_mem_token_free(mem_token);
	return 0;                   /* no data to send */
    }
    /*************************************************/
    /** Are there sufficient descriptors available? **/
    /*************************************************/
    if (txd_need_cnt > ch->txd_num) { /* never enough descriptors for this
				       * large a buffer */
	if (cxt1e1_log_level >= LOG_DEBUG)
	    pr_info("start_xmit: discarding buffer, insufficient descriptor cnt %d, need %d.\n",
		    ch->txd_num, txd_need_cnt + 1);
	ch->s.tx_dropped++;
	OS_mem_token_free(mem_token);
	return 0;
    }
#if 0
    spin_lock_irqsave(&ch->ch_txlock, flags);
#endif
    /************************************************************/
    /** flow control the line if not enough descriptors remain **/
    /************************************************************/
    if (txd_need_cnt > ch->txd_free) {
	if (cxt1e1_log_level >= LOG_MONITOR2)
	    pr_info("start_xmit[%d]: EBUSY - need more descriptors, have %d of %d need %d\n",
		    channum, ch->txd_free, ch->txd_num, txd_need_cnt);
	ch->tx_full = 1;
	ch->txd_required = txd_need_cnt;
	sd_disable_xmit(ch->user);
#if 0
	spin_unlock_irqrestore(&ch->ch_txlock, flags);
#endif
	return -EBUSY;               /* tell user to try again later */
    }
    /**************************************************/
    /** Put the user data into MUSYCC data buffer(s) **/
    /**************************************************/
    m2 = mem_token;
    md = ch->txd_usr_add;           /* get current available descriptor */

    for (len = OS_mem_token_tlen(m2); len > 0; m2 = OS_mem_token_next(m2)) {
	int         u = OS_mem_token_len(m2);

	if (!u)
	    continue;
	len -= u;

	/*
	 * Enable following chunks, yet wait to enable the FIRST chunk until
	 * after ALL subsequent chunks are setup.
	 */
	if (md != ch->txd_usr_add)  /* not first chunk */
	    u |= MUSYCC_TX_OWNED;   /* transfer ownership from HOST to MUSYCC */

	if (len)                    /* not last chunk */
	    u |= EOBIRQ_ENABLE;
	else if (ch->p.chan_mode == CFG_CH_PROTO_TRANS)	{
	    /*
	     * Per MUSYCC Ref 6.4.9 for Transparent Mode, the host must
	     * always clear EOMIRQ_ENABLE in every Transmit Buffer Descriptor
	     * (IE. don't set herein).
	     */
	    u |= EOBIRQ_ENABLE;
	} else
	    u |= EOMIRQ_ENABLE;     /* EOM, last HDLC chunk */


	/* last chunk in hdlc mode */
	u |= (ch->p.idlecode << IDLE_CODE);
	if (ch->p.pad_fill_count) {
#if 0
	    /* NOOP NOTE: u_int8_t cannot be > 0xFF */
	    /* sanitize pad_fill_count for maximums allowed by hardware */
	    if (ch->p.pad_fill_count > EXTRA_FLAGS_MASK)
		ch->p.pad_fill_count = EXTRA_FLAGS_MASK;
#endif
	    u |= (PADFILL_ENABLE | (ch->p.pad_fill_count << EXTRA_FLAGS));
	}
	md->mem_token = len ? NULL : mem_token;    /* Fill in mds on last
						 * segment, others set ZERO
						 * so that entire token is
						 * removed ONLY when ALL
						 * segments have been
						 * transmitted. */

	md->data = cpu_to_le32(OS_vtophys(OS_mem_token_data(m2)));
	FLUSH_MEM_WRITE();
	md->status = cpu_to_le32(u);
	--ch->txd_free;
	md = md->snext;
    }
    FLUSH_MEM_WRITE();


    /*
     * Now transfer ownership of first chunk from HOST to MUSYCC in order to
     * fire-off this XMIT.
     */
    ch->txd_usr_add->status |= __constant_cpu_to_le32(MUSYCC_TX_OWNED);
    FLUSH_MEM_WRITE();
    ch->txd_usr_add = md;

    len = OS_mem_token_tlen(mem_token);
    atomic_add(len, &ch->tx_pending);
    atomic_add(len, &ci->tx_pending);
    ch->s.tx_packets++;
    ch->s.tx_bytes += len;
    /*
     * If an ONR was seen, then channel requires poking to restart
     * transmission.
     */
    if (ch->ch_start_tx)
	musycc_chan_restart(ch);
#ifdef SBE_WAN256T3_ENABLE
    wan256t3_led(ci, LED_TX, LEDV_G);
#endif
    return 0;
}


/*** End-of-File ***/
