lib_ocm.c

Go to the documentation of this file.
00001 /* #pragma ident "@(#)lib_ocm.c 1.22 09/13/07 EDT" */
00002 
00096 #include "edtinc.h"
00097 
00098 #include "edt_bitload.h"
00099 
00100 #ifdef _NT_
00101 #else
00102 
00103 #define __USE_GNU
00104 #include <sys/types.h>
00105 #include <sys/stat.h>
00106 #include <fcntl.h>
00107 
00108 #include <stdio.h>
00109 
00110 #include <stdlib.h>
00111 
00112 #define HANDLE int
00113 
00114 
00115 #endif
00116 
00117 #include "edt_ocm.h"
00118 
00119 /***************************************
00120 * Some utility functions
00121 * These probably ought to go in a general
00122 * library file
00123 **************************************/
00124 
00125 #if 1
00126 
00127 int
00128 edt_reg_set_bitmask(EdtDev *edt_p, u_int reg, u_int mask, int state)
00129 
00130 {
00131 
00132     return  (state)? edt_reg_or(edt_p, reg, mask) : edt_reg_and(edt_p, reg, ~mask);
00133 }
00134 
00135 #else
00136 
00137 #define edt_reg_set_bitmask(edt_p, reg, mask, state) \
00138     ((state)? edt_reg_or(edt_p, reg, mask) : edt_reg_and(edt_p, reg, ~mask))
00139 
00140 #endif
00141 
00142 
00143 int
00144 edt_wait_register_bits_low(EdtDev *edt_p, u_int reg, u_int mask, int timeout)
00145 
00146 {
00147     int t = 0;
00148 
00149     while ((t < timeout || !timeout) && (edt_reg_read(edt_p,reg) & mask))
00150     {
00151         edt_msleep(100);
00152         t += 100;
00153     }
00154 
00155     return (t > timeout && (timeout != 0));
00156 }
00157 
00158 
00159 int
00160 edt_wait_register_bits_high(EdtDev *edt_p, u_int reg, u_int mask, int timeout)
00161 
00162 {
00163     int t = 0;
00164 
00165     while ((t < timeout || !timeout) && 
00166         !((edt_reg_read(edt_p,reg) & mask)==mask))
00167     {
00168         edt_msleep(100);
00169         t += 100;
00170     }
00171 
00172     return (t > timeout && (timeout != 0));
00173 
00174 }
00175 
00176 /**********************************
00177 * These functions work the same 
00178 * on both OCM and OC192
00179 **********************************/
00180 
00190 void
00191 edt_ocx_enable_framing_errors(EdtDev *edt_p, int state)
00192 
00193 {
00194 
00195     u_int mezzanine_offset = 0;
00196 
00197     if (edt_p->channel_no & 1)
00198     {
00199         mezzanine_offset = OFFSET_CH1_MEZ;
00200     }
00201 
00202     edt_reg_set_bitmask(edt_p, OCM_CH0_CNT_CTRL + mezzanine_offset,
00203         OCM_EN_ERROR_COUNT, state);
00204 
00205 }
00206 
00207 
00220 int 
00221 edt_ocx_get_framing_errors(EdtDev *edt_p, EdtOCXFrameErrors *err_p)
00222 
00223 {
00224     u_int mezzanine_offset = 0;
00225 
00226     if (edt_p->channel_no & 1)
00227     {
00228         mezzanine_offset = OFFSET_CH1_MEZ;
00229     }
00230     /* Assume frame counts are enabled */
00231 
00232     edt_reg_set_bitmask(edt_p, OCM_CH0_CNT_CTRL + mezzanine_offset , 
00233         OCM_ERROR_COUNT_HOLD, 1);
00234 
00235     err_p->b1_errors = edt_reg_read(edt_p, 
00236         OCM_CH0_B1_ERROR_CNT + mezzanine_offset);
00237     err_p->b1_error_mask = (u_char) edt_reg_read(edt_p, 
00238         OCM_CH0_B1_ERROR_MASK + mezzanine_offset);
00239     err_p->b2_errors = edt_reg_read(edt_p, 
00240         OCM_CH0_B2_ERROR_CNT + mezzanine_offset);
00241     err_p->m1_errors = edt_reg_read(edt_p, 
00242         OCM_CH0_M1_ERROR_CNT + mezzanine_offset);
00243     err_p->lof_errors = edt_reg_read(edt_p, 
00244         OCM_CH0_LOF_CNT + mezzanine_offset);
00245     err_p->frame_pattern_errors = edt_reg_read(edt_p, 
00246         OCM_CH0_FRM_PAT_CNT + mezzanine_offset);
00247     err_p->false_frame_errors = edt_reg_read(edt_p, 
00248         OCM_CH0_FALSE_FRM_CNT + mezzanine_offset);
00249 
00250     edt_reg_set_bitmask(edt_p, OCM_CH0_CNT_CTRL + mezzanine_offset , 
00251         OCM_ERROR_COUNT_HOLD, 0);
00252 
00253     return 0;
00254 }
00255 
00256 
00270 int
00271 edt_ocx_lock_local_clock(EdtDev *edt_p, int timeout)
00272 
00273 {
00274 
00275     FENTER("edt_ocx_lock_clocks");
00276 
00277     if (edt_wait_register_bits_high(edt_p, PCD_STAT, LOCAL_SYS_LOCK,timeout))
00278     {
00279         edt_msg(EDTLIB_MSG_FATAL,"\rBaseboard System clock not locked");
00280         return -1;
00281     }
00282 
00283     edt_msg(EDTLIB_MSG_INFO_1,"Local System clocks locked \n");
00284 
00285     return 0;
00286 
00287 }
00288 
00303 int
00304 edt_ocx_lock_channel_clock(EdtDev *edt_p, int channel, int timeout)
00305 
00306 {
00307     int base_offset;
00308 
00309     FENTER("edt_ocx_lock_clocks");
00310 
00311     base_offset = (channel & 1) ? OFFSET_CH1_BASE:0;
00312 
00313     if (edt_wait_register_bits_high (edt_p, OCM_CH0_ENABLE + base_offset, SYS_LOCK,timeout))
00314     {
00315         edt_msg(EDTLIB_MSG_FATAL,"\rMezzanine System clock not locked");
00316         return -1;
00317 
00318     }
00319 
00320     return 0;
00321 
00322 }
00323 
00338 int
00339 edt_msdv_load_default_mezzanine(EdtDev *edt_p, char *mezz_0)
00340 
00341 {
00342     int rc = 0;
00343 
00344     char *bitname = "dvb_asi.bit";
00345 
00346     if (mezz_0)
00347         if (mezz_0[0])
00348             bitname = mezz_0;
00349 
00350     rc = edt_bitload(edt_p, ".", bitname, BITLOAD_FLAGS_MEZZANINE, 0);
00351 
00352     return rc;
00353 }
00354 
00369 int
00370 edt_net10g_load_default_mezzanine(EdtDev *edt_p, char *mezz_0, char *mezz_1)
00371 
00372 {
00373     int rc = 0;
00374 
00375     char *bitname = "net10g_5v_sdh.bit";
00376 
00377     FENTER("edt_net10g_load_default_mezzanine");
00378     if (mezz_0)
00379         if (mezz_0[0])
00380             bitname = mezz_0;
00381 
00382     rc = edt_bitload(edt_p, ".", bitname, BITLOAD_FLAGS_MEZZANINE, 0);
00383 
00384     if (rc == 0)
00385     {
00386         bitname = "net10g_s3_cfg.bit";
00387 
00388         if (mezz_1)
00389             if (mezz_1[0])
00390                 bitname = mezz_1;
00391 
00392         rc = edt_bitload(edt_p, ".", bitname, BITLOAD_FLAGS_MEZZANINE | BITLOAD_FLAGS_CH1, 0);
00393     }
00394 
00395     return rc;
00396 }
00397 
00398 /***************************************
00399 *
00400 * OCM specific functions
00401 * Most have equivalent OC192 functions
00402 *
00403 **************************************/
00404 
00415 int
00416 edt_ocm_lock_clocks(EdtDev *edt_p, int timeout)
00417 
00418 {
00419 
00420     if (edt_ocx_lock_local_clock(edt_p, timeout) ||
00421         edt_ocx_lock_channel_clock(edt_p, 0, timeout) ||
00422         edt_ocx_lock_channel_clock(edt_p, 1, timeout))
00423 
00424         return -1;
00425 
00426     edt_msg(EDTLIB_MSG_INFO_1,"All System clocks locked          \n");
00427 
00428     return 0;
00429 
00430 }
00431 
00432 
00444 char *
00445 edt_ocm_mezz_filename(EdtDev *edt_p, EdtLineRate line_rate)
00446 
00447 {
00448 
00449     char *target_bitfile;
00450 
00451     switch (line_rate) {
00452         case OC3_RATE:      
00453         case OC12_RATE:     
00454         case STM1_RATE:
00455         case STM4_RATE:
00456             target_bitfile="ocm12.bit";
00457             break;
00458 
00459         case STM16_RATE:            
00460         case OC48_RATE:     
00461             target_bitfile="ocm48.bit";
00462             break;
00463 
00464         case GIGE_RATE:
00465             target_bitfile="ethernet.bit";
00466             break;
00467         
00468         default:
00469                 target_bitfile = NULL;
00470 
00471     }
00472 
00473     return target_bitfile;
00474 }
00475 
00493 int
00494 edt_ocm_load_default_mezzanine(EdtDev *edt_p, 
00495                                EdtLineRate line_rate,
00496                                char *mezz_0,
00497                                char *mezz_1)
00498 
00499 {
00500 
00501     int rc = 0;
00502     int flags  = BITLOAD_FLAGS_OVR | BITLOAD_FLAGS_OCM;
00503     int rate = OC48_RATE;
00504 
00505     char *bitname;
00506 
00507     if (edt_p->channel_no == 0)
00508         rate = (line_rate)?line_rate:OC48_RATE;
00509 
00510     if (mezz_0 && mezz_0[0])
00511         bitname = mezz_0;
00512     else
00513         bitname = edt_ocm_mezz_filename(edt_p, rate);
00514 
00515     rc = edt_bitload(edt_p, ".", bitname, flags, 0);
00516 
00517     if (rc == 0)
00518     {
00519         flags |= BITLOAD_FLAGS_CH1;
00520 
00521         if (mezz_1 && mezz_1[0])
00522             bitname = mezz_1;
00523         else
00524             bitname = edt_ocm_mezz_filename(edt_p, OC12_RATE);
00525 
00526         rc = edt_bitload(edt_p, ".", bitname, flags, 0);
00527 
00528     }
00529 
00530     return rc;
00531 
00532 }
00533 
00546 int
00547 edt_ocm_speed_capable(EdtDev *edt_p, EdtLineRate line_rate)
00548 
00549 {
00550     int rc = -1;
00551     switch (line_rate) {
00552         case STM1_RATE:
00553         case STM4_RATE:
00554         case OC3_RATE:      
00555         case OC12_RATE:     
00556         case GIGE_RATE:
00557             rc =  0;
00558             break;
00559 
00560         case STM16_RATE:            
00561         case OC48_RATE:     
00562             if ((edt_p->channel_no & 1) == 0)
00563                 rc = 0;
00564             break;
00565 
00566         case STM64_RATE:
00567         case OC192_RATE:
00568             rc =  -1;
00569             break;
00570 
00571         default:
00572             edt_msg(EDTLIB_MSG_FATAL,"Unknown bit rate %d\n", line_rate);
00573             rc =  -1;
00574 
00575     } 
00576     return rc;
00577 }
00578 
00579 
00580 
00594 int
00595 edt_ocm_has_mezz_bitfile(EdtDev *edt_p, char *bitfile_name)
00596 
00597 {
00598     int channel = edt_p->channel_no & 1;
00599     char *ch_id;
00600     int rc;
00601 
00602     FENTER_S("edt_ocm_has_correct_bitfile",bitfile_name);
00603 
00604     if (channel == 0)
00605     {
00606         ch_id  = edt_p->bfd.mezz_name0;
00607     }
00608     else
00609     {
00610         ch_id  = edt_p->bfd.mezz_name1;
00611     }
00612 
00613     /* check correct bitfile for channel 0 */
00614     rc = strncmp(ch_id, bitfile_name, strlen(bitfile_name));
00615 
00616     FRETURN_I("edt_ocm_has_correct_bitfile",rc);
00617 
00618     return rc;
00619 
00620 }
00634 int
00635 edt_ocm_set_clock_select(EdtDev *edt_p, EdtLineRate line_rate)
00636 
00637 {
00638     int channel = edt_p->channel_no & 1;
00639     int clk_select = CLK_SONET_SDH;
00640     int clk_val = OC3_STM1;
00641     int base_offset = 0;
00642     int mezzanine_offset = 0;
00643     int read_byte;
00644 
00645 
00646     FENTER_I("edt_ocm_set_clock_select", line_rate);
00647 
00648     switch (line_rate)
00649     {
00650     case OC3_RATE:          
00651     case STM1_RATE:
00652         clk_val = OC3_STM1;
00653         break;
00654 
00655     case OC12_RATE:      
00656     case STM4_RATE:
00657         clk_val = OC12_STM4;
00658         break;
00659 
00660     case STM16_RATE:        
00661     case OC48_RATE:         
00662         clk_val = OC48_STM16;
00663         break;
00664 
00665     case GIGE_RATE:
00666         clk_val = OC24;
00667         clk_select = CLK_GE | 0x4;
00668         break;
00669 
00670     }
00671 
00672     if (channel == 1) 
00673     {
00674         base_offset = OFFSET_CH1_BASE;
00675         mezzanine_offset = OFFSET_CH1_MEZ;
00676     }
00677 
00678     /* select the oscillator frequency */
00679     read_byte = edt_reg_read(edt_p, OCM_TX_CONFIG + mezzanine_offset); 
00680     read_byte &= ~CLOCK_SEL_MSK;
00681     read_byte |= clk_select;
00682     edt_reg_write(edt_p, OCM_TX_CONFIG + mezzanine_offset, read_byte );
00683     /* set LIU to correct multiplier */
00684     read_byte = edt_reg_read(edt_p, OCM_CH0_CONFIG0 + base_offset);  
00685     read_byte &= ~RX_SEL_MSK;
00686     read_byte |= clk_val;
00687     edt_reg_write(edt_p, OCM_CH0_CONFIG0 + base_offset , read_byte);  
00688 
00689 
00690     FRETURN("edt_ocm_set_clock_select");
00691 
00692     return 0;
00693 
00694 }
00695 
00711 int
00712 edt_ocm_channel_lock_frontend(EdtDev *edt_p, EdtOCConfig *cfg)
00713 
00714 {
00715     int done = 0;
00716     /* it takes 200 ms every time through */
00717 
00718     int timeout = cfg->timeout;
00719     int timer = 0;
00720     int timed_out = 0;
00721 
00722     uint_t base_offset = 0;
00723     uint_t mezzanine_offset = 0;
00724     int channel = edt_p->channel_no & 1;
00725     int rc;
00726 
00727     if (channel == 1)
00728     {
00729         base_offset = OFFSET_CH1_BASE;
00730         mezzanine_offset = OFFSET_CH1_MEZ;
00731 
00732     }
00733     /* Reset front end DPLLs */
00734     edt_reg_and(edt_p, OCM_CH0_ENABLE + base_offset,  ~(SLK_EN | PLL_EN));
00735 
00736     edt_reg_or(edt_p, OCM_CH0_ENABLE + base_offset, RAM_EN | SYS_EN);
00737 
00738     while (done == 0 && !timed_out)
00739     {
00740 
00741         /* check signal detect */
00742         if ((cfg->flags & EDT_OCX_NO_SIG_DET) ||
00743         edt_ocx_channel_signal_detect(edt_p))
00744         {
00745             /* enable SLK */
00746             edt_reg_or(edt_p, OCM_CH0_ENABLE + base_offset, SLK_EN); 
00747             edt_msleep(100); /* wait for the DCM to lock */
00748             timer += 100;
00749             /* test if SLK is locked */
00750             /* LOL is a reliable indication of some lock problems but not all */
00751             if ((edt_reg_read(edt_p, OCM_CH0_STATUS + base_offset) & LOL) == 0)
00752             {
00753                 edt_reg_or(edt_p, OCM_CH0_ENABLE + base_offset, PLL_EN); 
00754                 edt_msleep(100); /* wait for the DCM to lock */
00755                 timer += 100;
00756                 if ((done = (edt_reg_read(edt_p, OCM_CH0_ENABLE + base_offset) & RX_LOCK)) == 0)
00757                 {
00758                     edt_msg(EDT_MSG_WARNING,"\rChannel %d FPGA PLL not locked check signal input type", channel);
00759                     /* reset slk and dcm enable */
00760                     edt_reg_and(edt_p, OCM_CH0_ENABLE + base_offset, ~(SLK_EN | PLL_EN));
00761                 }
00762             }
00763             else
00764             {
00765                 edt_msg(EDT_MSG_WARNING,"\rChannel %d LIU PLL not locked check signal input type", channel);
00766                 /* reset slk and dcm enable */
00767                 edt_reg_and(edt_p, OCM_CH0_ENABLE + base_offset, ~(SLK_EN | PLL_EN));
00768             }
00769         }
00770         else
00771         {
00772             edt_msg(EDT_MSG_WARNING,"\rChannel %d no signal detected -  check signal input", channel);
00773             edt_reg_and(edt_p, OCM_CH0_ENABLE + base_offset, ~(SLK_EN | PLL_EN));
00774             /* always imcrement timer at least one */
00775             timer ++;
00776         }  
00777 
00778         if (timeout)
00779             timed_out = timer >= timeout;
00780 
00781     }
00782 
00783     edt_msg(EDT_MSG_INFO_1,"\rChannel %d PLL locked                    \n", channel);
00784 
00785     /* make error negative */
00786     rc = -timed_out;
00787 
00788     return rc;
00789 
00790 }
00808 int
00809 edt_ocm_channel_setup(EdtDev *edt_p, EdtOCConfig *cfg)
00810 
00811 
00812 {
00813     int channel = edt_p->channel_no;
00814     int base_offset = 0;
00815     int mezzanine_offset = 0;
00816     u_char rx_ctrl ;
00817     u_char rx_filter ;
00818 
00819     FENTER("edt_ocm_channel_setup");
00820 
00821     if (edt_p->mezz.id == MEZZ_OC192)
00822     {
00823         edt_reg_write(edt_p, OC192_CHAN_SELECT, 0);     
00824     }
00825 
00826 
00827     if (channel == 1)
00828     {
00829         base_offset = OFFSET_CH1_BASE;
00830         mezzanine_offset = OFFSET_CH1_MEZ;
00831 
00832     }
00833 
00834     /* set local loopback if requested */
00835     edt_reg_set_bitmask(edt_p, OCM_CH0_CONFIG0 + base_offset, LOCAL_LOOP, (cfg->flags & EDT_OCX_LOOPBACK));
00836 
00837     /* set remote loopback if requested */
00838     edt_reg_set_bitmask(edt_p, OCM_CH0_CONFIG0 + base_offset, REMOTE_LOOP, (cfg->flags & EDT_OCX_REMOTE_LPBK));
00839 
00840     /* set LIU PRBS7 generator if requested */
00841     edt_reg_set_bitmask(edt_p, OCM_CH0_CONFIG0 + base_offset, PRBS_EN, (cfg->flags & EDT_OCX_PRBS_EN));
00842 
00843 
00844     rx_ctrl = (u_char) edt_reg_read(edt_p, OCM_RX_CTRL + mezzanine_offset);
00845 
00846     if (cfg->flags & EDT_OCX_FRAMED)
00847     {
00848         rx_ctrl |= FRAME_EN;
00849         if ((cfg->flags & EDT_OCX_DESCRAMBLE) == 0)
00850             rx_ctrl |= DISABLE_SCRAM;
00851         else
00852             rx_ctrl &= ~DISABLE_SCRAM;
00853     }
00854     else
00855         rx_ctrl &= ~FRAME_EN;
00856 
00857     if (cfg->flags & EDT_OCX_ENABLE_MEM)
00858         rx_ctrl |= RX_DATA_SRC_2G;
00859     else
00860         rx_ctrl &= ~RX_DATA_SRC_2G;
00861 
00862     edt_reg_write(edt_p, OCM_RX_CTRL + mezzanine_offset, rx_ctrl); 
00863 
00864     rx_filter = (u_char) edt_reg_read(edt_p, OCM_RX_FILTER + mezzanine_offset);
00865     rx_filter &= ~OVERHEAD_ONLY; 
00866     if (cfg->flags & EDT_OCX_OVHD_ONLY) 
00867     {
00868         if (cfg->flags & EDT_OCX_FRAMED)
00869             rx_filter |= OVERHEAD_ONLY; 
00870         else
00871             edt_msg(EDT_MSG_WARNING,"Overhead filter does not work in raw data mode\n");
00872     }
00873     edt_reg_write(edt_p, OCM_RX_FILTER + mezzanine_offset, rx_filter); 
00874 
00875     FRETURN_I("edt_ocm_channel_setup",0);
00876     return 0;
00877 }
00878 
00890 int
00891 edt_ocm_wait_for_frame(EdtDev *edt_p, int timeout)
00892 
00893 {
00894     u_int cfg;
00895     int mezzanine_offset = 0;
00896     int t = 100;
00897     int rc = 0;
00898 
00899     FENTER("edt_ocm_wait_for_frame");
00900 
00901     if (edt_p->channel_no == 1)
00902     {
00903         mezzanine_offset = OFFSET_CH1_MEZ;
00904     }
00905 
00906     edt_msg(EDTLIB_MSG_INFO_1,"Waiting for frame CH%d", edt_p->channel_no);
00907 
00908     edt_msleep(100);
00909 
00910     while (((cfg = edt_reg_read(edt_p, OCM_RX_STATUS + mezzanine_offset)) & FRAMED) == 0 &&
00911         t < timeout)
00912     {
00913         edt_msg(EDTLIB_MSG_INFO_1,".");
00914         cfg = edt_reg_read(edt_p, OCM_RX_CTRL + mezzanine_offset);
00915         edt_reg_write(edt_p, OCM_RX_CTRL + mezzanine_offset, cfg | RESET_FRM);  /* set reset frame */
00916         edt_reg_write(edt_p, OCM_RX_CTRL + mezzanine_offset, cfg);  /* clear it */
00917         edt_msleep(100);
00918         t += 100;
00919     }
00920 
00921     if (t < timeout)
00922         edt_msg(EDTLIB_MSG_INFO_1," framed\n");
00923     else
00924     {
00925         edt_msg(EDTLIB_MSG_FATAL," Framing timed out in %d ms\n", timeout);
00926         rc = -1;
00927     }
00928 
00929     FRETURN_I("edt_ocm_wait_for_frame", rc);
00930 
00931     return rc;
00932 
00933 }
00934 
00935 /***************************************
00936 *
00937 * OC192 board-specific functions
00938 * Most other than the _mdio_ access functions
00939 * have an euqivalent OCM function
00940 *
00941 **************************************/
00942 
00943 /***************************************
00944 *
00945 * OC192 mdio functions to talk to the LIU
00946 *
00947 **************************************/
00948 
00949 
00962 unsigned char 
00963 edt_oc192_mdio_read(EdtDev *edt_p, unsigned char address)
00964 {
00965     unsigned char result=0, byte;
00966     unsigned int val;
00967     int i;
00968 
00969     FENTER_I("edt_oc192_mdio_read",address);
00970     val = 0x60000000;
00971     val |= ((unsigned int) (address & 0x1f))<<18;
00972     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_TRI);
00973     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_TRI | SCLK_TRI);
00974     result = 0;
00975     for (i=31; i>=0; i--) {
00976         if (i>17) {
00977             if (!((val>>i) & 0x1)) {
00978                 edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_TRI | SCLK_TRI);
00979                 edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_TRI | SCLK | SCLK_TRI);
00980             } else {
00981                 edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SDATA_TRI | SCLK_TRI);
00982                 edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SDATA_TRI | SCLK | SCLK_TRI);
00983             }
00984             edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_TRI | SCLK_TRI);
00985         } else {
00986             edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SCLK_TRI);
00987             edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SCLK | SCLK_TRI);
00988             if (i<=8 && i>=1) {
00989                 byte = edt_intfc_read(edt_p, OC192_LIU_MDIO_BUS) & SDATA_IN;
00990                 result |= ((byte>>4)<<(i-1));
00991             }
00992         }
00993     }
00994     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SCLK_TRI);
00995     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SCLK | SCLK_TRI);
00996     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SCLK);
00997     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, 0);
00998 
00999     FRETURN_I("edt_oc192_mdio_read",result);
01000     return result;
01001 }
01002 
01014 void
01015 edt_oc192_mdio_write(EdtDev *edt_p, unsigned char address, unsigned char value)
01016 {
01017     unsigned int val;
01018     int i;
01019 
01020     FENTER_I_I("edt_oc192_mdio_write",address, value);
01021     val = 0x50020000;
01022     val |= ((((unsigned int) (address & 0x1f))<<18) | (unsigned int) value);
01023     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_TRI);
01024     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_TRI | SCLK_TRI);
01025     for (i=31; i>=0; i--) {
01026         if (!((val>>i)&0x1)) {
01027             edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_TRI | SCLK_TRI);
01028             edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_TRI | SCLK | SCLK_TRI);
01029         } else {
01030             edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SDATA_TRI | SCLK_TRI);
01031             edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SDATA_TRI | SCLK | SCLK_TRI);
01032         }
01033     }
01034     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SDATA_TRI | SCLK_TRI);
01035     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SDATA_TRI | SCLK | SCLK_TRI);
01036     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SDATA_TRI | SCLK_TRI);
01037     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SDATA_TRI | SCLK | SCLK_TRI);
01038 
01039     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SCLK) ;
01040     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, 0);
01041     FRETURN("edt_oc192_mdio_write");
01042 }
01043 
01052 void 
01053 edt_oc192_mdio_init(EdtDev *edt_p)
01054 {
01055     int i;
01056 
01057     FENTER("edt_oc192_mdio_init");
01058 
01059     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SDATA_TRI);
01060     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SDATA_TRI | SCLK_TRI);
01061     for (i=32; i>=0; i--) {
01062         edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SDATA_TRI | SCLK_TRI);
01063         edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SDATA_TRI | SCLK | SCLK_TRI);
01064     }
01065     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, SDATA_OUT | SCLK);
01066     edt_intfc_write(edt_p, OC192_LIU_MDIO_BUS, 0);
01067     FRETURN("edt_oc192_mdio_init");
01068 }
01069 
01077 void
01078 edt_oc192_reset_liu(EdtDev *edt_p)
01079 
01080 {
01081     FENTER("edt_oc192_reset_liu");
01082     /* Reset the AMCC S19235 */
01083     edt_intfc_write(edt_p, OC192_ENABLE, edt_intfc_read(edt_p, OC192_ENABLE) | AMCC_RST);
01084     edt_msleep(100);
01085     edt_intfc_write(edt_p, OC192_ENABLE, edt_intfc_read(edt_p, OC192_ENABLE) & ~AMCC_RST);
01086     edt_msleep(100);
01087     edt_oc192_mdio_init(edt_p);
01088     FRETURN("edt_oc192_reset_liu");
01089 }
01090 
01098 void
01099 edt_oc192_mdio_set_clock(EdtDev *edt_p)
01100 
01101 {
01102 
01103 }
01104 
01114 void
01115 edt_oc192_mdio_set_swap(EdtDev *edt_p, int on)
01116 
01117 {
01118     FENTER("edt_oc192_mdio_set_swap");
01119     edt_oc192_mdio_write(edt_p, 0x2, 
01120         (edt_oc192_mdio_read(edt_p, 0x2) & 0xfb) | ((on)? 0x2 : 0) );
01121     FRETURN("edt_oc192_mdio_set_swap");
01122 }
01123 
01131 void
01132 edt_oc192_mdio_dump(EdtDev *edt_p)
01133 
01134 {       
01135     uint_t i;
01136 
01137     for (i=1; i<=0x1f; i++)
01138         if (i<0x11 || i>0x1d)
01139             printf("%02xH       :  %02xH\n", i, edt_oc192_mdio_read(edt_p, (u_char) i));
01140 }
01141 
01142 
01152 void
01153 edt_oc192_mdio_loopback(EdtDev *edt_p, int on)
01154 
01155 {
01156     FENTER("edt_oc192_mdio_loopback");
01157     edt_oc192_mdio_write(edt_p, 0x1, edt_oc192_mdio_read(edt_p, 0x1) & 0xfd | ((on)? 0:0x2) );
01158     FRETURN("edt_oc192_mdio_loopback");
01159 }
01160 
01170 void
01171 edt_oc192_mdio_set_prbs23(EdtDev *edt_p, int on)
01172 {
01173     /*
01174     * Select prbs23 code
01175     */
01176     FENTER("edt_oc192_mdio_set_prbs23");
01177     edt_oc192_mdio_write(edt_p, 0x6, (edt_oc192_mdio_read(edt_p, 0x6) & 0xe7) | (on) ? 0x10 : 0);
01178     FRETURN("edt_oc192_mdio_set_prbs23");
01179 }
01180 
01190 void
01191 edt_oc192_mdio_set_prbs31(EdtDev *edt_p, int on)
01192 {
01193     /*
01194     * Select prbs23 code
01195     */
01196     FENTER("edt_oc192_mdio_set_prbs31");
01197     edt_oc192_mdio_write(edt_p, 0x6, (edt_oc192_mdio_read(edt_p, 0x6) & 0xe7) | (on) ? 0x11 : 0);
01198     FRETURN("edt_oc192_mdio_set_prbs31");
01199 }
01200 
01208 void
01209 edt_oc192_mdio_standard(EdtDev *edt_p)
01210 
01211 {
01212     FENTER("edt_oc192_mdio_standard");
01213     /*
01214     * Refclk is 155.52, turn on DATA_SWAP
01215     */
01216     edt_oc192_mdio_set_swap(edt_p, 1);
01217 
01218     /*
01219     * Bit 2-0
01220     * Phase offset between high speed recovered data and clock for improved BER
01221     * 000 => + 8.5 ps (default)
01222     * 111 => - 11.0 ps
01223     *
01224     * Bit 7-6
01225     * Post amplifier offset adjust
01226     * 
01227     */
01228     /* 
01229     * post amp equalization adjust
01230     * bit 4-2
01231     * 000               No equalization                         -0.8dB
01232     * 001               0% - 5%                                         1.4dB
01233     * 010               5% - 10%                                        2.4dB
01234     * .......
01235     * 111               30% - 35%                                       7.5dB
01236     */
01237     edt_oc192_mdio_write(edt_p, 0xe, (edt_oc192_mdio_read(edt_p, 0xe) & 0xfb) | 0x18 );
01238 
01239     FRETURN("edt_oc192_mdio_standard");
01240 }
01241 
01253 int
01254 edt_oc192_set_liu(EdtDev *edt_p, int mode)
01255 
01256 {
01257     int rc = 0;
01258     FENTER("edt_oc192_set_liu");
01259 
01260     edt_oc192_reset_liu(edt_p);
01261 
01262     switch(mode)
01263     {
01264     case EDT_OC192_LIU_NORMAL:
01265         edt_oc192_mdio_standard(edt_p);
01266         break;
01267 
01268     case EDT_OC192_LIU_LOOPBACK:
01269         edt_oc192_mdio_set_swap(edt_p, 1);
01270         edt_oc192_mdio_loopback(edt_p, 1);
01271         break;
01272 
01273     case EDT_OC192_LIU_BIST_TX:
01274         /*
01275         * Refclk is 155.52, turn on DATA_SWAP
01276         */
01277         edt_oc192_mdio_set_swap(edt_p, 1);
01278         /*
01279         * Select prbs23 code
01280         */
01281         edt_oc192_mdio_write(edt_p, 0x6, (edt_oc192_mdio_read(edt_p, 0x6) & 0xf7) | 0x10);
01282         /*
01283         * Transmit built in self test mode
01284         */
01285         edt_oc192_mdio_write(edt_p, 0x5, edt_oc192_mdio_read(edt_p, 0x5) | 0x40);
01286         /*
01287         * Turn on diagnostic loopback
01288         */
01289         edt_oc192_mdio_loopback(edt_p, 1);
01290         break;
01291 
01292     case EDT_OC192_LIU_BIST_TX_EXT:
01293         /*
01294         * Refclk is 155.52, turn on DATA_SWAP
01295         */
01296         edt_oc192_mdio_set_swap(edt_p, 1);
01297         /*
01298         * Select prbs23 code
01299         */
01300         edt_oc192_mdio_write(edt_p, 0x6, (edt_oc192_mdio_read(edt_p, 0x6) & 0xf7) | 0x10);
01301         /*
01302         * Transmit built in self test mode
01303         */
01304         edt_oc192_mdio_write(edt_p, 0x5, edt_oc192_mdio_read(edt_p, 0x5) | 0x40);
01305         /*
01306         * Turn off diagnostic loopback
01307         */
01308         edt_oc192_mdio_loopback(edt_p, 0);
01309         break;
01310 
01311     case EDT_OC192_LIU_BIST_RX:
01312         /*
01313         * Refclk is 155.52, turn on DATA_SWAP
01314         */
01315         edt_oc192_mdio_set_swap(edt_p, 1);
01316         /*
01317         * Select prbs23 code
01318         */
01319         edt_oc192_mdio_write(edt_p, 0x6, (edt_oc192_mdio_read(edt_p, 0x6) & 0xf7) | 0x10);
01320         /*
01321         * Receive built in self test mode
01322         * turn on line loopback
01323         */
01324         edt_oc192_mdio_write(edt_p, 0x5, edt_oc192_mdio_read(edt_p, 0x5) | 0x04);
01325         break;
01326 
01327     default:
01328         rc = -1;
01329     }
01330 
01331     FRETURN_I("edt_oc192_set_liu",rc);
01332     return rc;
01333 }
01334 
01335 
01336 
01348 int
01349 edt_oc192_lock_clocks(EdtDev *edt_p, int timeout)
01350 
01351 {
01352 
01353 
01354     if (edt_ocx_lock_local_clock(edt_p, timeout) ||
01355         edt_ocx_lock_channel_clock(edt_p, edt_p->channel_no, timeout))
01356 
01357         return -1;
01358 
01359     edt_msg(EDTLIB_MSG_INFO_1,"All System clocks locked          \n");
01360 
01361     return 0;
01362 
01363 }
01364 
01376 int
01377 edt_msdv_lock_clocks(EdtDev *edt_p, int timeout)
01378 
01379 {
01380 
01381 
01382     if (edt_ocx_lock_local_clock(edt_p, timeout) ||
01383             (edt_wait_register_bits_high (edt_p, OCM_CH0_ENABLE, SYS_LOCK,timeout)))
01384     {
01385         edt_msg(EDTLIB_MSG_FATAL,"\rMezzanine System clock not locked");
01386         return -1;
01387 
01388     }
01389 
01390     edt_msg(EDTLIB_MSG_INFO_1,"All System clocks locked          \n");
01391 
01392     return 0;
01393 
01394 }
01395 
01407 char *
01408 edt_oc192_mezz_filename(EdtDev *edt_p, EdtLineRate line_rate)
01409 
01410 {
01411     char *target_bitfile = NULL;
01412 
01413     switch (line_rate) {
01414         case OC3_RATE:      
01415         case OC12_RATE:     
01416         case STM1_RATE:
01417         case STM4_RATE:
01418             if (edt_p->mezz.extended_rev == 2)
01419                 target_bitfile="oc12m2.bit";
01420             else
01421                 target_bitfile="oc12m.bit";
01422 
01423 
01424             break;
01425 
01426         case STM16_RATE:            
01427         case OC48_RATE:     
01428             if (edt_p->mezz.extended_rev == 2)
01429                 target_bitfile="oc48m2.bit";
01430             else
01431                 target_bitfile="oc48m.bit";
01432 
01433             break;
01434 
01435         case STM64_RATE:
01436         case OC192_RATE:
01437             if (edt_p->mezz.extended_rev == 2)
01438                 target_bitfile="oc192m2.bit";
01439             else
01440                 target_bitfile="oc192m.bit";
01441             break;
01442 
01443     }
01444 
01445     return target_bitfile;
01446 
01447 }
01448 
01449 
01461 char *
01462 edt_net10g_mezz_filename(EdtDev *edt_p, EdtLineRate line_rate)
01463 
01464 {
01465     char *target_bitfile = NULL;
01466 
01467     target_bitfile = "net10g_v5_sdh.bit";
01468 
01469 
01470 
01471     return target_bitfile;
01472 
01473 }
01474 
01475 
01476 
01493 int
01494 edt_oc192_load_default_mezzanine(EdtDev *edt_p, EdtLineRate line_rate,
01495                                  char *mezz_0, char *mezz_1)
01496 
01497 {
01498     int rc = 0;
01499 
01500     char *bitname = edt_oc192_mezz_filename(edt_p, 
01501         (line_rate)?line_rate:OC192_RATE);
01502 
01503     if (mezz_0)
01504         if (mezz_0[0])
01505             bitname = mezz_0;
01506 
01507     rc = edt_bitload(edt_p, ".", bitname, BITLOAD_FLAGS_MEZZANINE, 0);
01508 
01509     return rc;
01510 }
01511 
01512 
01525 int
01526 edt_oc192_speed_capable(EdtDev *edt_p, EdtLineRate line_rate)
01527 
01528 {
01529     int rc = -1;
01530 
01531     switch (line_rate) {
01532         case STM1_RATE:
01533         case STM4_RATE:
01534         case STM16_RATE:            
01535         case OC3_RATE:      
01536         case OC12_RATE:     
01537         case OC48_RATE:     
01538             if ((edt_p->channel_no & 1) == 0)
01539                 rc = 0;
01540             break;
01541 
01542         case STM64_RATE:
01543         case OC192_RATE:
01544             if ((edt_p->channel_no & 1) == 1)
01545                 rc = 0;
01546             break;
01547 
01548         case GIGE_RATE:
01549             rc =  -1;
01550             break;
01551 
01552         default:
01553             edt_msg(EDTLIB_MSG_FATAL,"Unknown bit rate %d\n", line_rate);
01554             rc =  -1;
01555 
01556     } 
01557     return rc;
01558 
01559 }
01560 
01561 
01562 
01563 
01564 
01578 int
01579 edt_oc192_has_mezz_bitfile(EdtDev *edt_p, char *bitfile_name)
01580 
01581 {
01582     int rc;
01583     FENTER_S("edt_oc192_has_correct_bitfile",bitfile_name);
01584 
01585     rc = strncmp(edt_p->bfd.mezz_name0, bitfile_name, strlen(bitfile_name));
01586 
01587     FRETURN_I("edt_oc192_has_correct_bitfile",rc);
01588 
01589     return rc;
01590 }
01591 
01605 int
01606 edt_net10g_has_mezz_bitfile(EdtDev *edt_p, char *bitfile_name)
01607 
01608 {
01609     int rc;
01610     FENTER_S("edt_net10g_has_correct_bitfile",bitfile_name);
01611 
01612     rc = strncmp(edt_p->bfd.mezz_name0, bitfile_name, strlen(bitfile_name));
01613 
01614     FRETURN_I("edt_net10g_has_correct_bitfile",rc);
01615 
01616     return rc;
01617 }
01618 
01633 int
01634 edt_oc192_set_clock_select(EdtDev *edt_p, EdtLineRate line_rate)
01635 
01636 {
01637     int channel = edt_p->channel_no;
01638 
01639 
01640     FENTER_I("edt_oc192et_clock_select", line_rate);
01641 
01642     if (channel == 0) 
01643     {
01644         edt_reg_write(edt_p, OC192_CHAN_SELECT, 0x0);
01645 
01646         return edt_ocm_set_clock_select(edt_p, line_rate);
01647 
01648     }
01649     else
01650     {
01651         edt_reg_write(edt_p, OC192_CHAN_SELECT, 0x1);
01652         /* somehow affecting module not ready */
01653         edt_reg_write(edt_p, OC192_ENABLE, PLL_EN);
01654 
01655         edt_msleep(1000);
01656 
01657         /* seelect clock in register FIX !!!*/
01658 
01659     }
01660 
01661     FRETURN("edt_ocx_set_clock_select");
01662 
01663     return 0;
01664 
01665 }
01666 
01677 int
01678 edt_oc192_clear_demux(EdtDev *edt_p)
01679 
01680 {
01681     int i;
01682 
01683     FENTER("edt_oc192_clear_demux");
01684 
01685     /* make sure demux is turned off */
01686     edt_reg_write(edt_p, OC192_DEMUX_BITMASK, 0);
01687     for (i=0x80;i<0x8c;i++)
01688         edt_reg_write(edt_p, OC192_DEMUX_MASK_ADDR, i);
01689 
01690 
01691     FRETURN("edt_oc192_clear_demux");
01692 
01693     return 0;
01694 
01695 }
01696 
01706 void
01707 edt_oc192_set_framer(EdtDev *edt_p, int flags)
01708 
01709 {
01710 
01711     int rx_ctrl;
01712 
01713     FENTER_I("edt_oc192_set_framer", flags);
01714 
01715     rx_ctrl = 0;
01716     if (flags & EDT_OCX_FRAMED)
01717     {
01718         rx_ctrl |= OC192_FRAME_EN;
01719         if ((flags & EDT_OCX_DESCRAMBLE) == 0)
01720             rx_ctrl |= OC192_DISABLE_SCRAM;
01721     }
01722 
01723     edt_reg_write(edt_p, OC192_FRAMING, rx_ctrl);
01724 
01725     FRETURN("edt_oc192_set_framer");
01726 
01727 }
01728 
01747 int
01748 edt_oc192_channel_lock_frontend(EdtDev *edt_p, EdtOCConfig *cfg)
01749 
01750 {
01751     int rc;
01752     int rx_filter;
01753 
01754     /* AMCC received clock not locked */
01755 
01756     if ((rc = edt_wait_register_bits_high(edt_p, OC192_LIU_STATUS, 0x1, cfg->timeout)))
01757     {
01758         edt_msg(EDTLIB_MSG_FATAL,"AMCC receiver won't lock\n");
01759         return -1;
01760     }
01761     else
01762         edt_msg(EDTLIB_MSG_INFO_1,"AMCC receiver PLL is locked\n");
01763 
01764     /* added 2/13/2008 jsc */
01765 
01766     rx_filter = (u_char) edt_reg_read(edt_p, OC192_RCV_FILTER);
01767     rx_filter &= ~OVERHEAD_ONLY; 
01768     if (cfg->flags & EDT_OCX_OVHD_ONLY) 
01769     {
01770         if (cfg->flags & EDT_OCX_FRAMED)
01771             rx_filter |= OVERHEAD_ONLY; 
01772         else
01773             edt_msg(EDT_MSG_WARNING,"Overhead filter does not work in raw data mode\n");
01774     }
01775     edt_reg_write(edt_p, OC192_RCV_FILTER, rx_filter); 
01776 
01777     edt_reg_write(edt_p, OC192_ENABLE, 0);
01778     edt_reg_write(edt_p, OC192_ENABLE, 0x2);
01779     edt_reg_write(edt_p, OC192_ENABLE, 0x6);
01780     edt_reg_write(edt_p, OC192_ENABLE, 0xe);
01781     edt_reg_write(edt_p, OC192_ENABLE, 0x1e);
01782     edt_msleep(100);
01783 
01784     /* Received DCM not locked */
01785     if ((rc = edt_wait_register_bits_high(edt_p, OC192_ENABLE, 0xb0, cfg->timeout)))
01786     {
01787         edt_msg(EDTLIB_MSG_FATAL,"Receive DCM won't lock\n");
01788         return -1;
01789 
01790     }
01791     else
01792         edt_msg(EDTLIB_MSG_INFO_1,"Receive DCM Locked\n");
01793 
01794 
01795 
01796     return 0;
01797 
01798 }
01799 
01818 int
01819 edt_net10g_channel_lock_frontend(EdtDev *edt_p, EdtOCConfig *cfg)
01820 
01821 {
01822     int rc;
01823     int rx_filter;
01824 
01825     /* AMCC received clock not locked */
01826 
01827     if ((rc = edt_wait_register_bits_high(edt_p, OC192_LIU_STATUS, 0x1, cfg->timeout)))
01828     {
01829         edt_msg(EDTLIB_MSG_FATAL,"AMCC receiver won't lock\n");
01830         return -1;
01831     }
01832     else
01833         edt_msg(EDTLIB_MSG_INFO_1,"AMCC receiver PLL is locked\n");
01834 
01835     /* added 2/13/2008 jsc */
01836 
01837     rx_filter = (u_char) edt_reg_read(edt_p, OC192_RCV_FILTER);
01838     rx_filter &= ~OVERHEAD_ONLY; 
01839     if (cfg->flags & EDT_OCX_OVHD_ONLY) 
01840     {
01841         if (cfg->flags & EDT_OCX_FRAMED)
01842             rx_filter |= OVERHEAD_ONLY; 
01843         else
01844             edt_msg(EDT_MSG_WARNING,"Overhead filter does not work in raw data mode\n");
01845     }
01846     edt_reg_write(edt_p, OC192_RCV_FILTER, rx_filter); 
01847 
01848     edt_reg_write(edt_p, OC192_ENABLE, 0);
01849     edt_reg_write(edt_p, OC192_ENABLE, 0x2);
01850     edt_reg_write(edt_p, OC192_ENABLE, 0x6);
01851     edt_reg_write(edt_p, OC192_ENABLE, 0xe);
01852     edt_reg_write(edt_p, OC192_ENABLE, 0x1e);
01853     edt_msleep(100);
01854 
01855     /* Received DCM not locked */
01856     if ((rc = edt_wait_register_bits_high(edt_p, OC192_ENABLE, 0xb0, cfg->timeout)))
01857     {
01858         edt_msg(EDTLIB_MSG_FATAL,"Receive DCM won't lock\n");
01859         return -1;
01860 
01861     }
01862     else
01863         edt_msg(EDTLIB_MSG_INFO_1,"Receive DCM Locked\n");
01864 
01865 
01866 
01867     return 0;
01868 
01869 }
01870 
01871 
01888 int
01889 edt_oc192_channel_setup(EdtDev *edt_p, 
01890                         EdtOCConfig *cfg)
01891 
01892 {
01893     int rc;
01894 
01895     edt_reg_write(edt_p, OC192_CHAN_SELECT, 0x1);
01896 
01897     /* turn off output as prbs (must be turned off for tagging) */
01898 
01899     edt_reg_write(edt_p, OC192_OUTPUT_DATA_SEL, 0);
01900     /* power up transceiver */
01901 
01902     edt_reg_write(edt_p, OC192_XCVR_CTL_STAT, 0x4);
01903 
01904     if (rc = edt_wait_register_bits_low(edt_p, OC192_XCVR_CTL_STAT, 0x50, cfg->timeout))
01905     {
01906         edt_msg(EDTLIB_MSG_FATAL,"module absent/loss of signal/(module not ready)\n");
01907         return -1;
01908     }
01909 
01910     if(cfg->flags & EDT_OCX_LOOPBACK) {
01911         edt_oc192_set_liu(edt_p, EDT_OC192_LIU_LOOPBACK);
01912         edt_reg_write(edt_p, OC192_OUTPUT_DATA_SEL, 0x19);
01913     } else {
01914         edt_oc192_set_liu(edt_p, EDT_OC192_LIU_NORMAL);
01915     }
01916 
01917     /* set framer */
01918 
01919     edt_oc192_set_framer(edt_p, cfg->flags);
01920 
01921     if (cfg->flags & EDT_OCX_TAGGED_DATA)
01922         edt_oc192_set_tagging(edt_p,1,cfg->tagid);
01923 
01924     return 0;
01925 }
01926 
01943 int
01944 edt_net10g_channel_setup(EdtDev *edt_p, 
01945                         EdtOCConfig *cfg)
01946 
01947 {
01948     int rc;
01949 
01950     edt_reg_write(edt_p, OC192_CHAN_SELECT, 0x1);
01951 
01952     /* turn off output as prbs (must be turned off for tagging) */
01953 
01954     edt_reg_write(edt_p, OC192_OUTPUT_DATA_SEL, 0);
01955     /* power up transceiver */
01956 
01957     edt_reg_write(edt_p, OC192_XCVR_CTL_STAT, 0x4);
01958 
01959     if (rc = edt_wait_register_bits_low(edt_p, OC192_XCVR_CTL_STAT, 0x50, cfg->timeout))
01960     {
01961         edt_msg(EDTLIB_MSG_FATAL,"module absent/loss of signal/(module not ready)\n");
01962         return -1;
01963     }
01964 
01965     if(cfg->flags & EDT_OCX_LOOPBACK) {
01966         edt_oc192_set_liu(edt_p, EDT_OC192_LIU_LOOPBACK);
01967         edt_reg_write(edt_p, OC192_OUTPUT_DATA_SEL, 0x19);
01968     } else {
01969         edt_oc192_set_liu(edt_p, EDT_OC192_LIU_NORMAL);
01970     }
01971 
01972     /* set framer */
01973 
01974     edt_oc192_set_framer(edt_p, cfg->flags);
01975 
01976     if (cfg->flags & EDT_OCX_TAGGED_DATA)
01977         edt_oc192_set_tagging(edt_p,1,cfg->tagid);
01978 
01979     return 0;
01980 }
01981 
01994 int
01995 edt_oc192_wait_for_frame(EdtDev *edt_p, int timeout)
01996 
01997 {
01998     int rc = 0;
01999 
02000     FENTER("edt_oc192_wait_for_frame");
02001 
02002     edt_msg(EDTLIB_MSG_INFO_1,"Waiting for frame CH%d", edt_p->channel_no);
02003 
02004     if (rc = edt_wait_register_bits_high(edt_p, OC192_FRAMING, 
02005         OC192_FRAME_LOCK , timeout))
02006     { 
02007         edt_msg(EDTLIB_MSG_FATAL," - Framing timed out\n");
02008         rc = -1;
02009     }
02010     else
02011         edt_msg(EDTLIB_MSG_INFO_1," framed\n");
02012 
02013     FRETURN_I("edt_oc192_wait_for_frame", rc);
02014 
02015     return rc;
02016 
02017 }
02018 
02034 int
02035 edt_oc192_set_tagging(EdtDev *edt_p, int state, int tagid)
02036 
02037 {
02038     u_char mask = 0;
02039 
02040     if (state)
02041     {
02042         /* All boards are set up to acquire only selected