/* Copyright (C) 2003-2005  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.
 */

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <asm/io.h>
#include <linux/hdlc.h>
#include "pmcc4_sysdep.h"
#include "sbecom_inline_linux.h"
#include "libsbew.h"
#include "pmcc4.h"
#include "comet.h"
#include "comet_tables.h"

#ifdef SBE_INCLUDE_SYMBOLS
#define STATIC
#else
#define STATIC  static
#endif


extern int  cxt1e1_log_level;

#define COMET_NUM_SAMPLES   24  /* Number of entries in the waveform table */
#define COMET_NUM_UNITS     5   /* Number of points per entry in table */

/* forward references */
STATIC void SetPwrLevel (comet_t * comet);
STATIC void WrtRcvEqualizerTbl (ci_t * ci, comet_t * comet, u_int32_t *table);
STATIC void WrtXmtWaveformTbl (ci_t * ci, comet_t * comet, u_int8_t table[COMET_NUM_SAMPLES][COMET_NUM_UNITS]);


void       *TWV_table[12] = {
    TWVLongHaul0DB, TWVLongHaul7_5DB, TWVLongHaul15DB, TWVLongHaul22_5DB,
    TWVShortHaul0, TWVShortHaul1, TWVShortHaul2, TWVShortHaul3, TWVShortHaul4,
    TWVShortHaul5,
    TWV_E1_75Ohm,    /** PORT POINT - 75 Ohm not supported **/
    TWV_E1_120Ohm
};


static int
lbo_tbl_lkup (int t1, int lbo)
{
    if ((lbo < CFG_LBO_LH0) || (lbo > CFG_LBO_E120))    /* error switches to
                                                         * default */
    {
        if (t1)
            lbo = CFG_LBO_LH0;  /* default T1 waveform table */
        else
            lbo = CFG_LBO_E120;     /* default E1 waveform table */
    }
    return (lbo - 1);               /* make index ZERO relative */
}


void
init_comet (void *ci, comet_t * comet, u_int32_t port_mode, int clockmaster,
            u_int8_t moreParams)
{
    u_int8_t isT1mode;
    u_int8_t    tix = CFG_LBO_LH0;      /* T1 default */

    isT1mode = IS_FRAME_ANY_T1 (port_mode);
    /* T1 or E1 */
    if (isT1mode)
    {
        pci_write_32 ((u_int32_t *) &comet->gbl_cfg, 0xa0);     /* Select T1 Mode & PIO
                                                                 * output enabled */
        tix = lbo_tbl_lkup (isT1mode, CFG_LBO_LH0);     /* default T1 waveform
                                                         * table */
    } else
    {
        pci_write_32 ((u_int32_t *) &comet->gbl_cfg, 0x81);     /* Select E1 Mode & PIO
                                                                 * output enabled */
        tix = lbo_tbl_lkup (isT1mode, CFG_LBO_E120);    /* default E1 waveform
                                                         * table */
    }

    if (moreParams & CFG_LBO_MASK)
        tix = lbo_tbl_lkup (isT1mode, moreParams & CFG_LBO_MASK);       /* dial-in requested
                                                                         * waveform table */

    /* Tx line Intfc cfg     ** Set for analog & no special patterns */
    pci_write_32 ((u_int32_t *) &comet->tx_line_cfg, 0x00);     /* Transmit Line
                                                                 * Interface Config. */

    /* master test    ** Ignore Test settings for now */
    pci_write_32 ((u_int32_t *) &comet->mtest, 0x00);   /* making sure it's
                                                         * Default value */

    /* Turn on Center (CENT) and everything else off */
    pci_write_32 ((u_int32_t *) &comet->rjat_cfg, 0x10);        /* RJAT cfg */
    /* Set Jitter Attenuation to recommend T1 values */
    if (isT1mode)
    {
        pci_write_32 ((u_int32_t *) &comet->rjat_n1clk, 0x2F);  /* RJAT Divider N1
                                                                 * Control */
        pci_write_32 ((u_int32_t *) &comet->rjat_n2clk, 0x2F);  /* RJAT Divider N2
                                                                 * Control */
    } else
    {
        pci_write_32 ((u_int32_t *) &comet->rjat_n1clk, 0xFF);  /* RJAT Divider N1
                                                                 * Control */
        pci_write_32 ((u_int32_t *) &comet->rjat_n2clk, 0xFF);  /* RJAT Divider N2
                                                                 * Control */
    }

    /* Turn on Center (CENT) and everything else off */
    pci_write_32 ((u_int32_t *) &comet->tjat_cfg, 0x10);        /* TJAT Config. */

    /* Do not bypass jitter attenuation and bypass elastic store */
    pci_write_32 ((u_int32_t *) &comet->rx_opt, 0x00);  /* rx opts */

    /* TJAT ctrl & TJAT divider ctrl */
    /* Set Jitter Attenuation to recommended T1 values */
    if (isT1mode)
    {
        pci_write_32 ((u_int32_t *) &comet->tjat_n1clk, 0x2F);  /* TJAT Divider N1
                                                                 * Control */
        pci_write_32 ((u_int32_t *) &comet->tjat_n2clk, 0x2F);  /* TJAT Divider N2
                                                                 * Control */
    } else
    {
        pci_write_32 ((u_int32_t *) &comet->tjat_n1clk, 0xFF);  /* TJAT Divider N1
                                                                 * Control */
        pci_write_32 ((u_int32_t *) &comet->tjat_n2clk, 0xFF);  /* TJAT Divider N2
                                                                 * Control */
    }

    /* 1c: rx ELST cfg   20: tx ELST cfg  28&38: rx&tx data link ctrl */
    if (isT1mode)
    {                               /* Select 193-bit frame format */
        pci_write_32 ((u_int32_t *) &comet->rx_elst_cfg, 0x00);
        pci_write_32 ((u_int32_t *) &comet->tx_elst_cfg, 0x00);
    } else
    {                               /* Select 256-bit frame format */
        pci_write_32 ((u_int32_t *) &comet->rx_elst_cfg, 0x03);
        pci_write_32 ((u_int32_t *) &comet->tx_elst_cfg, 0x03);
        pci_write_32 ((u_int32_t *) &comet->rxce1_ctl, 0x00);   /* disable T1 data link
                                                                 * receive */
        pci_write_32 ((u_int32_t *) &comet->txci1_ctl, 0x00);   /* disable T1 data link
                                                                 * transmit */
    }

    /* the following is a default value */
    /* Enable 8 out of 10 validation */
    pci_write_32 ((u_int32_t *) &comet->t1_rboc_ena, 0x00);     /* t1RBOC
                                                                 * enable(BOC:BitOriented
                                                                 * Code) */
    if (isT1mode)
    {

        /* IBCD cfg: aka Inband Code Detection ** loopback code length set to */
        pci_write_32 ((u_int32_t *) &comet->ibcd_cfg, 0x04);    /* 6 bit down, 5 bit up
                                                                 * (assert)  */
        pci_write_32 ((u_int32_t *) &comet->ibcd_act, 0x08);    /* line loopback
                                                                 * activate pattern */
        pci_write_32 ((u_int32_t *) &comet->ibcd_deact, 0x24);  /* deactivate code
                                                                 * pattern (i.e.001) */
    }
    /* 10: CDRC cfg 28&38: rx&tx data link 1 ctrl 48: t1 frmr cfg  */
    /* 50: SIGX cfg, COSS (change of signaling state) 54: XBAS cfg  */
    /* 60: t1 ALMI cfg */
    /* Configure Line Coding */

    switch (port_mode)
    {
    case CFG_FRAME_SF:              /* 1 - T1 B8ZS */
        pci_write_32 ((u_int32_t *) &comet->cdrc_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->t1_frmr_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->sigx_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->t1_xbas_cfg, 0x20); /* 5:B8ZS */
        pci_write_32 ((u_int32_t *) &comet->t1_almi_cfg, 0);
        break;
    case CFG_FRAME_ESF:     /* 2 - T1 B8ZS */
        pci_write_32 ((u_int32_t *) &comet->cdrc_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->rxce1_ctl, 0x20);   /* Bit 5: T1 DataLink
                                                                 * Enable */
        pci_write_32 ((u_int32_t *) &comet->txci1_ctl, 0x20);   /* 5: T1 DataLink Enable */
        pci_write_32 ((u_int32_t *) &comet->t1_frmr_cfg, 0x30); /* 4:ESF  5:ESFFA */
        pci_write_32 ((u_int32_t *) &comet->sigx_cfg, 0x04);    /* 2:ESF */
        pci_write_32 ((u_int32_t *) &comet->t1_xbas_cfg, 0x30); /* 4:ESF  5:B8ZS */
        pci_write_32 ((u_int32_t *) &comet->t1_almi_cfg, 0x10); /* 4:ESF */
        break;
    case CFG_FRAME_E1PLAIN:         /* 3 - HDB3 */
        pci_write_32 ((u_int32_t *) &comet->cdrc_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->sigx_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->e1_tran_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->e1_frmr_aopts, 0x40);
        break;
    case CFG_FRAME_E1CAS:           /* 4 - HDB3 */
        pci_write_32 ((u_int32_t *) &comet->cdrc_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->sigx_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->e1_tran_cfg, 0x60);
        pci_write_32 ((u_int32_t *) &comet->e1_frmr_aopts, 0);
        break;
    case CFG_FRAME_E1CRC:           /* 5 - HDB3 */
        pci_write_32 ((u_int32_t *) &comet->cdrc_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->sigx_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->e1_tran_cfg, 0x10);
        pci_write_32 ((u_int32_t *) &comet->e1_frmr_aopts, 0xc2);
        break;
    case CFG_FRAME_E1CRC_CAS:       /* 6 - HDB3 */
        pci_write_32 ((u_int32_t *) &comet->cdrc_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->sigx_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->e1_tran_cfg, 0x70);
        pci_write_32 ((u_int32_t *) &comet->e1_frmr_aopts, 0x82);
        break;
    case CFG_FRAME_SF_AMI:          /* 7 - T1 AMI */
        pci_write_32 ((u_int32_t *) &comet->cdrc_cfg, 0x80);    /* Enable AMI Line
                                                                 * Decoding */
        pci_write_32 ((u_int32_t *) &comet->t1_frmr_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->t1_xbas_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->t1_almi_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->sigx_cfg, 0);
        break;
    case CFG_FRAME_ESF_AMI:         /* 8 - T1 AMI */
        pci_write_32 ((u_int32_t *) &comet->cdrc_cfg, 0x80);    /* Enable AMI Line
                                                                 * Decoding */
        pci_write_32 ((u_int32_t *) &comet->rxce1_ctl, 0x20);   /* 5: T1 DataLink Enable */
        pci_write_32 ((u_int32_t *) &comet->txci1_ctl, 0x20);   /* 5: T1 DataLink Enable */
        pci_write_32 ((u_int32_t *) &comet->t1_frmr_cfg, 0x30); /* Bit 4:ESF  5:ESFFA */
        pci_write_32 ((u_int32_t *) &comet->sigx_cfg, 0x04);    /* 2:ESF */
        pci_write_32 ((u_int32_t *) &comet->t1_xbas_cfg, 0x10); /* 4:ESF */
        pci_write_32 ((u_int32_t *) &comet->t1_almi_cfg, 0x10); /* 4:ESF */
        break;
    case CFG_FRAME_E1PLAIN_AMI:       /* 9 - AMI */
        pci_write_32 ((u_int32_t *) &comet->cdrc_cfg, 0x80);    /* Enable AMI Line
                                                                 * Decoding */
        pci_write_32 ((u_int32_t *) &comet->sigx_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->e1_tran_cfg, 0x80);
        pci_write_32 ((u_int32_t *) &comet->e1_frmr_aopts, 0x40);
        break;
    case CFG_FRAME_E1CAS_AMI:       /* 10 - AMI */
        pci_write_32 ((u_int32_t *) &comet->cdrc_cfg, 0x80);    /* Enable AMI Line
                                                                 * Decoding */
        pci_write_32 ((u_int32_t *) &comet->sigx_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->e1_tran_cfg, 0xe0);
        pci_write_32 ((u_int32_t *) &comet->e1_frmr_aopts, 0);
        break;
    case CFG_FRAME_E1CRC_AMI:       /* 11 - AMI */
        pci_write_32 ((u_int32_t *) &comet->cdrc_cfg, 0x80);    /* Enable AMI Line
                                                                 * Decoding */
        pci_write_32 ((u_int32_t *) &comet->sigx_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->e1_tran_cfg, 0x90);
        pci_write_32 ((u_int32_t *) &comet->e1_frmr_aopts, 0xc2);
        break;
    case CFG_FRAME_E1CRC_CAS_AMI:   /* 12 - AMI */
        pci_write_32 ((u_int32_t *) &comet->cdrc_cfg, 0x80);    /* Enable AMI Line
                                                                 * Decoding */
        pci_write_32 ((u_int32_t *) &comet->sigx_cfg, 0);
        pci_write_32 ((u_int32_t *) &comet->e1_tran_cfg, 0xf0);
        pci_write_32 ((u_int32_t *) &comet->e1_frmr_aopts, 0x82);
        break;
    }                               /* end switch */

    /***
     * Set Full Frame mode (NXDSO[1] = 0, NXDSO[0] = 0)
     * CMODE=1: Clock slave mode with BRCLK as an input,
     * DE=0: Use falling edge of BRCLK for data,
     * FE=0: Use falling edge of BRCLK for frame,
     * CMS=0: Use backplane freq,
     * RATE[1:0]=0,0: T1
     ***/


    /* 0x30: "BRIF cfg"; 0x20 is 'CMODE', 0x03 is (bit) rate */
    /* note "rate bits can only be set once after reset" */
    if (clockmaster)
    {                               /* CMODE == clockMode, 0=clock master (so
                                     * all 3 others should be slave) */
        if (isT1mode)               /* rate = 1.544 Mb/s */
            pci_write_32 ((u_int32_t *) &comet->brif_cfg, 0x00);        /* Comet 0 Master
                                                                         * Mode(CMODE=0) */
        else                        /* rate = 2.048 Mb/s */
            pci_write_32 ((u_int32_t *) &comet->brif_cfg, 0x01);        /* Comet 0 Master
                                                                         * Mode(CMODE=0) */

        /* 31: BRIF frame pulse cfg  06: tx timing options */
        pci_write_32 ((u_int32_t *) &comet->brif_fpcfg, 0x00);  /* Master Mode
                                                                 * i.e.FPMODE=0 (@0x20) */
        if ((moreParams & CFG_CLK_PORT_MASK) == CFG_CLK_PORT_INTERNAL)
        {
            if (cxt1e1_log_level >= LOG_SBEBUG12)
                pr_info(">> %s: clockmaster internal clock\n", __func__);
            pci_write_32 ((u_int32_t *) &comet->tx_time, 0x0d); /* internal oscillator */
        } else                      /* external clock source */
        {
            if (cxt1e1_log_level >= LOG_SBEBUG12)
                pr_info(">> %s: clockmaster external clock\n", __func__);
            pci_write_32 ((u_int32_t *) &comet->tx_time, 0x09); /* loop timing
                                                                 * (external) */
        }

    } else                          /* slave */
    {
        if (isT1mode)
            pci_write_32 ((u_int32_t *) &comet->brif_cfg, 0x20);        /* Slave Mode(CMODE=1,
                                                                         * see above) */
        else
            pci_write_32 ((u_int32_t *) &comet->brif_cfg, 0x21);        /* Slave Mode (CMODE=1) */
        pci_write_32 ((u_int32_t *) &comet->brif_fpcfg, 0x20);  /* Slave Mode i.e.
                                                                 * FPMODE=1 (@0x20) */
        if (cxt1e1_log_level >= LOG_SBEBUG12)
            pr_info(">> %s: clockslave internal clock\n", __func__);
        pci_write_32 ((u_int32_t *) &comet->tx_time, 0x0d);     /* oscillator timing */
    }

    /* 32: BRIF parity F-bit cfg */
    /* Totem-pole operation */
    pci_write_32 ((u_int32_t *) &comet->brif_pfcfg, 0x01);      /* Receive Backplane
                                                                 * Parity/F-bit */

    /* dc: RLPS equalizer V ref */
    /* Configuration */
    if (isT1mode)
        pci_write_32 ((u_int32_t *) &comet->rlps_eqvr, 0x2c);   /* RLPS Equalizer
                                                                 * Voltage  */
    else
        pci_write_32 ((u_int32_t *) &comet->rlps_eqvr, 0x34);   /* RLPS Equalizer
                                                                 * Voltage  */

    /* Reserved bit set and SQUELCH enabled */
    /* f8: RLPS cfg & status  f9: RLPS ALOS detect/clear threshold */
    pci_write_32 ((u_int32_t *) &comet->rlps_cfgsts, 0x11);     /* RLPS Configuration
                                                                 * Status */
    if (isT1mode)
        pci_write_32 ((u_int32_t *) &comet->rlps_alos_thresh, 0x55);    /* ? */
    else
        pci_write_32 ((u_int32_t *) &comet->rlps_alos_thresh, 0x22);    /* ? */


    /* Set Full Frame mode (NXDSO[1] = 0, NXDSO[0] = 0) */
    /* CMODE=0: Clock slave mode with BTCLK as an input, DE=1: Use rising */
    /* edge of BTCLK for data, FE=1: Use rising edge of BTCLK for frame, */
    /* CMS=0: Use backplane freq, RATE[1:0]=0,0: T1 */
/***    Transmit side is always an Input, Slave Clock*/
    /* 40: BTIF cfg  41: BTIF frame pulse cfg */
    if (isT1mode)
        pci_write_32 ((u_int32_t *) &comet->btif_cfg, 0x38);    /* BTIF Configuration
                                                                 * Reg. */
    else
        pci_write_32 ((u_int32_t *) &comet->btif_cfg, 0x39);    /* BTIF Configuration
                                                                 * Reg. */

    pci_write_32 ((u_int32_t *) &comet->btif_fpcfg, 0x01);      /* BTIF Frame Pulse
                                                                 * Config. */

    /* 0a: master diag  06: tx timing options */
    /* if set Comet to loop back */

    /* Comets set to normal */
    pci_write_32 ((u_int32_t *) &comet->mdiag, 0x00);

    /* BTCLK driven by TCLKI internally (crystal driven) and Xmt Elasted  */
    /* Store is enabled. */

    WrtXmtWaveformTbl (ci, comet, TWV_table[tix]);
    if (isT1mode)
        WrtRcvEqualizerTbl ((ci_t *) ci, comet, &T1_Equalizer[0]);
    else
        WrtRcvEqualizerTbl ((ci_t *) ci, comet, &E1_Equalizer[0]);
    SetPwrLevel (comet);
}

/*
** Name:        WrtXmtWaveform
** Description: Formulate the Data for the Pulse Waveform Storage
**                Write register, (F2), from the sample and unit inputs.
**                Write the data to the Pulse Waveform Storage Data register.
** Returns:     Nothing
*/
STATIC void
WrtXmtWaveform (ci_t * ci, comet_t * comet, u_int32_t sample, u_int32_t unit, u_int8_t data)
{
    u_int8_t    WaveformAddr;

    WaveformAddr = (sample << 3) + (unit & 7);
    pci_write_32 ((u_int32_t *) &comet->xlpg_pwave_addr, WaveformAddr);
    pci_flush_write (ci);           /* for write order preservation when
                                     * Optimizing driver */
    pci_write_32 ((u_int32_t *) &comet->xlpg_pwave_data, 0x7F & data);
}

/*
** Name:        WrtXmtWaveformTbl
** Description: Fill in the Transmit Waveform Values
**                for driving the transmitter DAC.
** Returns:     Nothing
*/
STATIC void
WrtXmtWaveformTbl (ci_t * ci, comet_t * comet,
                   u_int8_t table[COMET_NUM_SAMPLES][COMET_NUM_UNITS])
{
    u_int32_t sample, unit;

    for (sample = 0; sample < COMET_NUM_SAMPLES; sample++)
    {
        for (unit = 0; unit < COMET_NUM_UNITS; unit++)
            WrtXmtWaveform (ci, comet, sample, unit, table[sample][unit]);
    }

    /* Enable transmitter and set output amplitude */
    pci_write_32 ((u_int32_t *) &comet->xlpg_cfg, table[COMET_NUM_SAMPLES][0]);
}


/*
** Name:        WrtXmtWaveform
** Description: Fill in the Receive Equalizer RAM from the desired
**                table.
** Returns:     Nothing
**
** Remarks:  Per PM4351 Device Errata, Receive Equalizer RAM Initialization
**           is coded with early setup of indirect address.
*/

STATIC void
WrtRcvEqualizerTbl (ci_t * ci, comet_t * comet, u_int32_t *table)
{
    u_int32_t   ramaddr;
    volatile u_int32_t value;

    for (ramaddr = 0; ramaddr < 256; ramaddr++)
    {
        /*** the following lines are per Errata 7, 2.5 ***/
        {
            pci_write_32 ((u_int32_t *) &comet->rlps_eq_rwsel, 0x80);   /* Set up for a read
                                                                         * operation */
            pci_flush_write (ci);   /* for write order preservation when
                                     * Optimizing driver */
            pci_write_32 ((u_int32_t *) &comet->rlps_eq_iaddr, (u_int8_t) ramaddr); /* write the addr,
                                                                                  * initiate a read */
            pci_flush_write (ci);   /* for write order preservation when
                                     * Optimizing driver */
            /*
             * wait 3 line rate clock cycles to ensure address bits are
             * captured by T1/E1 clock
             */
            OS_uwait (4, "wret");   /* 683ns * 3 = 1366 ns, approx 2us (but
                                     * use 4us) */
        }

        value = *table++;
        pci_write_32 ((u_int32_t *) &comet->rlps_idata3, (u_int8_t) (value >> 24));
        pci_write_32 ((u_int32_t *) &comet->rlps_idata2, (u_int8_t) (value >> 16));
        pci_write_32 ((u_int32_t *) &comet->rlps_idata1, (u_int8_t) (value >> 8));
        pci_write_32 ((u_int32_t *) &comet->rlps_idata0, (u_int8_t) value);
        pci_flush_write (ci);       /* for write order preservation when
                                     * Optimizing driver */

        /* Storing RAM address, causes RAM to be updated */

        pci_write_32 ((u_int32_t *) &comet->rlps_eq_rwsel, 0);  /* Set up for a write
                                                                 * operation */
        pci_flush_write (ci);       /* for write order preservation when
                                     * Optimizing driver */
        pci_write_32 ((u_int32_t *) &comet->rlps_eq_iaddr, (u_int8_t) ramaddr); /* write the addr,
                                                                                 * initiate a read */
        pci_flush_write (ci);       /* for write order preservation when
                                     * Optimizing driver */
        /*
         * wait 3 line rate clock cycles to ensure address bits are captured
         * by T1/E1 clock
         */
        OS_uwait (4, "wret");       /* 683ns * 3 = 1366 ns, approx 2us (but
                                     * use 4us) */
    }

    pci_write_32 ((u_int32_t *) &comet->rlps_eq_cfg, 0xCB);     /* Enable Equalizer &
                                                                 * set it to use 256
                                                                 * periods */
}


/*
** Name:        SetPwrLevel
** Description: Implement power level setting algorithm described below
** Returns:     Nothing
*/

STATIC void
SetPwrLevel (comet_t * comet)
{
    volatile u_int32_t temp;

/*
**    Algorithm to Balance the Power Distribution of Ttip Tring
**
**    Zero register F6
**    Write 0x01 to register F4
**    Write another 0x01 to register F4
**    Read register F4
**    Remove the 0x01 bit by Anding register F4 with 0xFE
**    Write the resultant value to register F4
**    Repeat these steps for register F5
**    Write 0x01 to register F6
*/
    pci_write_32 ((u_int32_t *) &comet->xlpg_fdata_sel, 0x00);  /* XLPG Fuse Data Select */

    pci_write_32 ((u_int32_t *) &comet->xlpg_atest_pctl, 0x01); /* XLPG Analog Test
                                                                 * Positive control */
    pci_write_32 ((u_int32_t *) &comet->xlpg_atest_pctl, 0x01);

    temp = pci_read_32 ((u_int32_t *) &comet->xlpg_atest_pctl) & 0xfe;
    pci_write_32 ((u_int32_t *) &comet->xlpg_atest_pctl, temp);

    pci_write_32 ((u_int32_t *) &comet->xlpg_atest_nctl, 0x01); /* XLPG Analog Test
                                                                 * Negative control */
    pci_write_32 ((u_int32_t *) &comet->xlpg_atest_nctl, 0x01);

    temp = pci_read_32 ((u_int32_t *) &comet->xlpg_atest_nctl) & 0xfe;
    pci_write_32 ((u_int32_t *) &comet->xlpg_atest_nctl, temp);
    pci_write_32 ((u_int32_t *) &comet->xlpg_fdata_sel, 0x01);  /* XLPG */
}


/*
** Name:        SetCometOps
** Description: Set up the selected Comet's clock edge drive for both
**                the transmit out the analog side and receive to the
**                backplane side.
** Returns:     Nothing
*/
#if 0
STATIC void
SetCometOps (comet_t * comet)
{
    volatile u_int8_t rd_value;

    if (comet == mConfig.C4Func1Base + (COMET0_OFFSET >> 2))
    {
        rd_value = (u_int8_t) pci_read_32 ((u_int32_t *) &comet->brif_cfg);     /* read the BRIF
                                                                                 * Configuration */
        rd_value &= ~0x20;
        pci_write_32 ((u_int32_t *) &comet->brif_cfg, (u_int32_t) rd_value);

        rd_value = (u_int8_t) pci_read_32 ((u_int32_t *) &comet->brif_fpcfg);   /* read the BRIF Frame
                                                                                 * Pulse Configuration */
        rd_value &= ~0x20;
        pci_write_32 ((u_int32_t *) &comet->brif_fpcfg, (u_int8_t) rd_value);
    } else
    {
        rd_value = (u_int8_t) pci_read_32 ((u_int32_t *) &comet->brif_cfg);     /* read the BRIF
                                                                                 * Configuration */
        rd_value |= 0x20;
        pci_write_32 ((u_int32_t *) &comet->brif_cfg, (u_int32_t) rd_value);

        rd_value = (u_int8_t) pci_read_32 ((u_int32_t *) &comet->brif_fpcfg);   /* read the BRIF Frame
                                                                                 * Pulse Configuration */
        rd_value |= 0x20;
        pci_write_32 ((u_int32_t *) &comet->brif_fpcfg, (u_int8_t) rd_value);
    }
}
#endif

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