00001
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
00121
00122
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
00178
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
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
00401
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
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
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
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
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
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
00742 if ((cfg->flags & EDT_OCX_NO_SIG_DET) ||
00743 edt_ocx_channel_signal_detect(edt_p))
00744 {
00745
00746 edt_reg_or(edt_p, OCM_CH0_ENABLE + base_offset, SLK_EN);
00747 edt_msleep(100);
00748 timer += 100;
00749
00750
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);
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
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
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
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
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
00835 edt_reg_set_bitmask(edt_p, OCM_CH0_CONFIG0 + base_offset, LOCAL_LOOP, (cfg->flags & EDT_OCX_LOOPBACK));
00836
00837
00838 edt_reg_set_bitmask(edt_p, OCM_CH0_CONFIG0 + base_offset, REMOTE_LOOP, (cfg->flags & EDT_OCX_REMOTE_LPBK));
00839
00840
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);
00916 edt_reg_write(edt_p, OCM_RX_CTRL + mezzanine_offset, cfg);
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
00938
00939
00940
00941
00942
00943
00944
00945
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
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
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
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
01215
01216 edt_oc192_mdio_set_swap(edt_p, 1);
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235
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
01276
01277 edt_oc192_mdio_set_swap(edt_p, 1);
01278
01279
01280
01281 edt_oc192_mdio_write(edt_p, 0x6, (edt_oc192_mdio_read(edt_p, 0x6) & 0xf7) | 0x10);
01282
01283
01284
01285 edt_oc192_mdio_write(edt_p, 0x5, edt_oc192_mdio_read(edt_p, 0x5) | 0x40);
01286
01287
01288
01289 edt_oc192_mdio_loopback(edt_p, 1);
01290 break;
01291
01292 case EDT_OC192_LIU_BIST_TX_EXT:
01293
01294
01295
01296 edt_oc192_mdio_set_swap(edt_p, 1);
01297
01298
01299
01300 edt_oc192_mdio_write(edt_p, 0x6, (edt_oc192_mdio_read(edt_p, 0x6) & 0xf7) | 0x10);
01301
01302
01303
01304 edt_oc192_mdio_write(edt_p, 0x5, edt_oc192_mdio_read(edt_p, 0x5) | 0x40);
01305
01306
01307
01308 edt_oc192_mdio_loopback(edt_p, 0);
01309 break;
01310
01311 case EDT_OC192_LIU_BIST_RX:
01312
01313
01314
01315 edt_oc192_mdio_set_swap(edt_p, 1);
01316
01317
01318
01319 edt_oc192_mdio_write(edt_p, 0x6, (edt_oc192_mdio_read(edt_p, 0x6) & 0xf7) | 0x10);
01320
01321
01322
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
01653 edt_reg_write(edt_p, OC192_ENABLE, PLL_EN);
01654
01655 edt_msleep(1000);
01656
01657
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
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
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
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
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
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
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
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
01898
01899 edt_reg_write(edt_p, OC192_OUTPUT_DATA_SEL, 0);
01900
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
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
01953
01954 edt_reg_write(edt_p, OC192_OUTPUT_DATA_SEL, 0);
01955
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
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