openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

phyecd.c (18726B)


      1 /*
      2  * 
      3  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      4  * 
      5  * Copyright 2007-2019 Broadcom Inc. All rights reserved.
      6  *
      7  * File:        phyecd.c
      8  * Purpose:     PHY ECD routines
      9  */
     10 
     11 #include <sal/core/thread.h>
     12 #include <soc/drv.h>
     13 #include <soc/debug.h>
     14 #include <soc/phy/phyctrl.h>
     15 #include <shared/bsl.h>
     16 #include "phyreg.h"
     17 
     18 int phy_ecd_cable_diag_init(int l1,soc_port_t l2){phy_ctrl_t*l3;uint16 l4;l3 = 
     19 EXT_PHY_SW_STATE(l1,l2);SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
     20 0x0f00|((0xc0)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
     21 ),(l3),0x00,0x0f00|((0xc7)&0xff),0x15,(0xa01a)));SOC_IF_ERROR_RETURN(
     22 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xc8)&0xff),0x15,(0x0100)));
     23 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xc9)&0xff),0x15
     24 ,(0x00ef)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xcc
     25 )&0xff),0x15,(0x0180)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
     26 0x0f00|((0xce)&0xff),0x15,(0x4000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
     27 ),(l3),0x00,0x0f00|((0xcf)&0xff),0x15,(0x4000)));SOC_IF_ERROR_RETURN(
     28 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe0)&0xff),0x15,(0x0a00)));
     29 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe1)&0xff),0x15
     30 ,(0x0c0e)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe2
     31 )&0xff),0x15,(0x0004)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
     32 0x0f00|((0xe3)&0xff),0x15,(0x5000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
     33 ),(l3),0x00,0x0f00|((0xe4)&0xff),0x15,(0x70cc)));SOC_IF_ERROR_RETURN(
     34 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe7)&0xff),0x15,(0x00a0)));
     35 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xef)&0xff),0x15
     36 ,(0x409f)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xcd
     37 )&0xff),0x15,(0x1000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
     38 0x0f00|((0xcd)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
     39 ),(l3),0x00,0x0f00|((0xe4)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(
     40 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe7)&0xff),0x15,(0x0000)));
     41 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xef)&0xff),0x15
     42 ,(0x8007)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xcd
     43 )&0xff),0x15,(0x1000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
     44 0x0f00|((0xcd)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
     45 ),(l3),0x00,0x0f00|((0xef)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(
     46 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe0)&0xff),0x15,(0x00e0)));
     47 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe1)&0xff),0x15
     48 ,(0x0501)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe2
     49 )&0xff),0x15,(0x0c06)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
     50 0x0f00|((0xe3)&0xff),0x15,(0x0c06)));SOC_IF_ERROR_RETURN(phy_reg_ge_read((l1)
     51 ,(l3),0x00,0x0f00|((0xc0)&0xff),0x15,(&l4)));SOC_IF_ERROR_RETURN(
     52 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xc0)&0xff),0x15,(0x4000)));return
     53 SOC_E_NONE;}static int l5(int l1,phy_ctrl_t*l3,uint16 l6[]){
     54 SOC_IF_ERROR_RETURN(phy_reg_ge_read((l1),(l3),0x00,0x0f00|((0xc0)&0xff),0x15,
     55 (&l6[0])));SOC_IF_ERROR_RETURN(phy_reg_ge_read((l1),(l3),0x00,0x0f00|((0xc1)&
     56 0xff),0x15,(&l6[1])));SOC_IF_ERROR_RETURN(phy_reg_ge_read((l1),(l3),0x00,
     57 0x0f00|((0xc2)&0xff),0x15,(&l6[2])));SOC_IF_ERROR_RETURN(phy_reg_ge_read((l1)
     58 ,(l3),0x00,0x0f00|((0xc3)&0xff),0x15,(&l6[3])));SOC_IF_ERROR_RETURN(
     59 phy_reg_ge_read((l1),(l3),0x00,0x0f00|((0xc4)&0xff),0x15,(&l6[4])));
     60 SOC_IF_ERROR_RETURN(phy_reg_ge_read((l1),(l3),0x00,0x0f00|((0xc5)&0xff),0x15,
     61 (&l6[5])));return SOC_E_NONE;}int phy_ecd_cable_diag(int l1,soc_port_t l2,
     62 soc_port_cable_diag_t*l7){phy_ctrl_t*l3;uint16 l8,l9;uint16 l10,l11;uint16 l12
     63 [6];uint16 l13;l3 = EXT_PHY_SW_STATE(l1,l2);l9 = 0;l13 = 0;
     64 SOC_IF_ERROR_RETURN(READ_PHY_REG(l1,l3,0x1,&l10));SOC_IF_ERROR_RETURN(
     65 READ_PHY_REG(l1,l3,0x1,&l10));sal_usleep(10000);SOC_IF_ERROR_RETURN(
     66 READ_PHY_REG(l1,l3,0x1,&l11));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),
     67 0x00,0x0f00|((0xc0)&0xff),0x15,(0x0000)));for(l8 = 0;l8<300;l8++){
     68 SOC_IF_ERROR_RETURN(l5(l1,l3,l12));if(l12[0]&0x4){l13 = 1;}if(!(l12[0]&0x0800
     69 )){break;}}if(l8>300){l9|= 0x0002;}if(!(((l10&l11&0x0004)!= 0)&&(l13 == 1))){
     70 l13 = 0;SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xc0)&
     71 0xff),0x15,(0x9000)));for(l8 = 0;l8<300;l8++){SOC_IF_ERROR_RETURN(l5(l1,l3,
     72 l12));if(!(l12[0]&0x0800)){break;}}if(l8>300){l9|= 0x0001;}if(((l12[1]&0xf000
     73 ) == 0x9000)||((l12[1]&0x0f00) == 0x0900)||((l12[1]&0x00f0) == 0x0090)||((l12
     74 [1]&0x000f) == 0x0009)){SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
     75 0x0f00|((0xe7)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
     76 ),(l3),0x00,0x0f00|((0xef)&0xff),0x15,(0x4080)));SOC_IF_ERROR_RETURN(
     77 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xcd)&0xff),0x15,(0x1000)));
     78 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xcd)&0xff),0x15
     79 ,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xc0
     80 )&0xff),0x15,(0x9000)));l13 = 0;for(l8 = 0;l8<300;l8++){SOC_IF_ERROR_RETURN(
     81 l5(l1,l3,l12));if(l12[0]&0x4){l13 = 1;}if(!(l12[0]&0x0800)){break;}}if(l8>300
     82 ){l9|= 0x0001;}if(!l13){l9|= 0x0008;}SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
     83 ),(l3),0x00,0x0f00|((0xe7)&0xff),0x15,(0x00a0)));SOC_IF_ERROR_RETURN(
     84 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xef)&0xff),0x15,(0x4080)));
     85 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xcd)&0xff),0x15
     86 ,(0x1000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xcd
     87 )&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
     88 0x0f00|((0xe7)&0xff),0x15,(0x0000)));}}if(l9){return SOC_E_UNAVAIL;}
     89 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xc0)&0xff),0x15
     90 ,(0x4000)));l7->npairs = 4;l7->fuzz_len = 10;switch((l12[1]>>12)&0x000f){case
     91 1:l7->pair_state[0] = SOC_PORT_CABLE_STATE_OK;l7->pair_len[0] = l12[2]/100;
     92 break;case 2:l7->pair_state[0] = SOC_PORT_CABLE_STATE_OPEN;l7->pair_len[0] = 
     93 l12[2]/100;break;case 3:l7->pair_state[0] = SOC_PORT_CABLE_STATE_SHORT;l7->
     94 pair_len[0] = l12[2]/100;break;case 4:l7->pair_state[0] = 
     95 SOC_PORT_CABLE_STATE_CROSSTALK;l7->pair_len[0] = l12[2]/100;break;default:l7
     96 ->pair_state[0] = SOC_PORT_CABLE_STATE_UNKNOWN;l7->pair_len[0] = 0;break;}
     97 switch((l12[1]>>8)&0x000f){case 1:l7->pair_state[1] = SOC_PORT_CABLE_STATE_OK
     98 ;l7->pair_len[1] = l12[3]/100;break;case 2:l7->pair_state[1] = 
     99 SOC_PORT_CABLE_STATE_OPEN;l7->pair_len[1] = l12[3]/100;break;case 3:l7->
    100 pair_state[1] = SOC_PORT_CABLE_STATE_SHORT;l7->pair_len[1] = l12[3]/100;break
    101 ;case 4:l7->pair_state[1] = SOC_PORT_CABLE_STATE_CROSSTALK;l7->pair_len[1] = 
    102 l12[3]/100;break;default:l7->pair_state[1] = SOC_PORT_CABLE_STATE_UNKNOWN;l7
    103 ->pair_len[1] = 0;break;}switch((l12[1]>>4)&0x000f){case 1:l7->pair_state[2] = 
    104 SOC_PORT_CABLE_STATE_OK;l7->pair_len[2] = l12[4]/100;break;case 2:l7->
    105 pair_state[2] = SOC_PORT_CABLE_STATE_OPEN;l7->pair_len[2] = l12[4]/100;break;
    106 case 3:l7->pair_state[2] = SOC_PORT_CABLE_STATE_SHORT;l7->pair_len[2] = l12[4
    107 ]/100;break;case 4:l7->pair_state[2] = SOC_PORT_CABLE_STATE_CROSSTALK;l7->
    108 pair_len[2] = l12[4]/100;break;default:l7->pair_state[2] = 
    109 SOC_PORT_CABLE_STATE_UNKNOWN;l7->pair_len[2] = 0;break;}switch((l12[1]>>0)&
    110 0x000f){case 1:l7->pair_state[3] = SOC_PORT_CABLE_STATE_OK;l7->pair_len[3] = 
    111 l12[5]/100;break;case 2:l7->pair_state[3] = SOC_PORT_CABLE_STATE_OPEN;l7->
    112 pair_len[3] = l12[5]/100;break;case 3:l7->pair_state[3] = 
    113 SOC_PORT_CABLE_STATE_SHORT;l7->pair_len[3] = l12[5]/100;break;case 4:l7->
    114 pair_state[3] = SOC_PORT_CABLE_STATE_CROSSTALK;l7->pair_len[3] = l12[5]/100;
    115 break;default:l7->pair_state[3] = SOC_PORT_CABLE_STATE_UNKNOWN;l7->pair_len[3
    116 ] = 0;break;}return SOC_E_NONE;}int phy_ecd_cable_diag_run_40nm(int l1,
    117 soc_port_t l2,soc_port_cable_diag_t*l7,uint16 l14){phy_ctrl_t*l3;uint16 l8,l9
    118 ;uint16 l10,l11;uint16 l12[6];uint16 l13,l15 = 0;l3 = EXT_PHY_SW_STATE(l1,l2)
    119 ;l9 = 0;l13 = 0;SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((
    120 0xc0)&0xff),0x15,(l14&0x3fff)));SOC_IF_ERROR_RETURN(READ_PHY_REG(l1,l3,0x1,&
    121 l10));SOC_IF_ERROR_RETURN(READ_PHY_REG(l1,l3,0x1,&l10));sal_usleep(10000);
    122 SOC_IF_ERROR_RETURN(READ_PHY_REG(l1,l3,0x1,&l11));SOC_IF_ERROR_RETURN(l5(l1,
    123 l3,l12));if(l12[0]&0x0800){l9|= 0x0002;SOC_IF_ERROR_RETURN(phy_reg_ge_write((
    124 l1),(l3),0x00,0x0f00|((0xc0)&0xff),0x15,(l14&0x7fff)));LOG_VERBOSE(
    125 BSL_LS_SOC_PHY,(BSL_META(
    126 "\t->ECD engine still busy during intial flush! (u=%d p=%d) \n"),l1,l2));l13 = 
    127 0;return SOC_E_FAIL;}if((((l10&l11&0x0004)!= 0)&&((l14&0x1000) == 0))){if(l12
    128 [0]&0x4){l13 = 1;}else{l13 = 0;}}else{SOC_IF_ERROR_RETURN(WRITE_PHY_REG(l1,l3
    129 ,0x18,0x0C00));SOC_IF_ERROR_RETURN(WRITE_PHY_REG(l1,l3,0x17,0x4030));
    130 SOC_IF_ERROR_RETURN(WRITE_PHY_REG(l1,l3,0x15,0x1072));SOC_IF_ERROR_RETURN(
    131 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xFB)&0xff),0x15,(0x7C00)));
    132 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xFF)&0xff),0x15
    133 ,(0x5F0F)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xFF
    134 )&0xff),0x15,(0x5000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
    135 0x0f00|((0xFB)&0xff),0x15,(0x4000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
    136 ),(l3),0x00,0x0f00|((0xc0)&0xff),0x15,(l14|0x8000)));l13 = 0;for(l8 = 0;l8<
    137 3000;l8++){SOC_IF_ERROR_RETURN(l5(l1,l3,l12));if(l12[0]&0x4){l13 = 1;}if(!(
    138 l12[0]&0x0800)){l15 = 1;break;}sal_usleep(1000);}if((l8>= 3000)||(l15 == 0)){
    139 l9|= 0x0001;}SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((
    140 0xFB)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),
    141 0x00,0x0f00|((0xFF)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(WRITE_PHY_REG(
    142 l1,l3,0x17,0x4030));SOC_IF_ERROR_RETURN(WRITE_PHY_REG(l1,l3,0x15,0x1872));
    143 SOC_IF_ERROR_RETURN(WRITE_PHY_REG(l1,l3,0x18,0x0400));SOC_IF_ERROR_RETURN(
    144 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xc0)&0xff),0x15,(l14&0x7FFF)));}if(
    145 l13 == 0){l9|= 0x0008;}if(l12[0]&0x8){l9|= 0x0004;}if(l9){if(l9&0x0001){
    146 LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META(
    147 "\t->ECD on demand not done - busy time out! (u:%d p:%d) \n"),l1,l2));}if(l9&
    148 0x0008){LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META(
    149 "\t->ECD no fresh result! (u:%d p:%d)\n"),l1,l2));}if(l9&0x0004){LOG_VERBOSE(
    150 BSL_LS_SOC_PHY,(BSL_META("\t->ECD result invalid! (u:%d p:%d)\n"),l1,l2));}}
    151 if((l12[2] == 0x47AE)||(l12[3] == 0x47AE)||(l12[4] == 0x47AE)||(l12[5] == 
    152 0x47AE)){LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META(
    153 "\t->ECD failure type 183! (u:%d p:%d)\n"),l1,l2));}if((l9&0xff)||((l12[2] == 
    154 0x47AE)||(l12[3] == 0x47AE)||(l12[4] == 0x47AE)||(l12[5] == 0x47AE))){
    155 LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META("\t->EXP_C[0]: %x\n"),l12[0]));
    156 LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META("\t->EXP_C[1]: %x\n"),l12[1]));
    157 LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META("\t->EXP_C[2]: %x\n"),l12[2]));
    158 LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META("\t->EXP_C[3]: %x\n"),l12[3]));
    159 LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META("\t->EXP_C[4]: %x\n"),l12[4]));
    160 LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META("\t->EXP_C[5]: %x\n"),l12[5]));l7->
    161 pair_state[0] = SOC_PORT_CABLE_STATE_UNKNOWN;return SOC_E_FAIL;}l7->npairs = 
    162 4;l7->fuzz_len = 10;l7->state = SOC_PORT_CABLE_STATE_OK;switch((l12[1]>>12)&
    163 0x000f){case 1:l7->pair_state[0] = SOC_PORT_CABLE_STATE_OK;l7->pair_len[0] = 
    164 l12[2]/100;break;case 2:l7->pair_state[0] = SOC_PORT_CABLE_STATE_OPEN;l7->
    165 pair_len[0] = l12[2]/100;break;case 3:l7->pair_state[0] = 
    166 SOC_PORT_CABLE_STATE_SHORT;l7->pair_len[0] = l12[2]/100;break;case 4:l7->
    167 pair_state[0] = SOC_PORT_CABLE_STATE_CROSSTALK;l7->pair_len[0] = l12[2]/100;
    168 break;case 9:LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META(
    169 "\t->Cabel Diag (40nm) pair A: u=%d p=%d\n, "
    170 "Persistent noise present on MDI\n"),l1,l2));l7->pair_state[0] = 
    171 SOC_PORT_CABLE_STATE_UNKNOWN;l7->pair_len[0] = 0;break;default:l7->pair_state
    172 [0] = SOC_PORT_CABLE_STATE_UNKNOWN;l7->pair_len[0] = 0;break;}switch((l12[1]
    173 >>8)&0x000f){case 1:l7->pair_state[1] = SOC_PORT_CABLE_STATE_OK;l7->pair_len[
    174 1] = l12[3]/100;break;case 2:l7->pair_state[1] = SOC_PORT_CABLE_STATE_OPEN;l7
    175 ->pair_len[1] = l12[3]/100;break;case 3:l7->pair_state[1] = 
    176 SOC_PORT_CABLE_STATE_SHORT;l7->pair_len[1] = l12[3]/100;break;case 4:l7->
    177 pair_state[1] = SOC_PORT_CABLE_STATE_CROSSTALK;l7->pair_len[1] = l12[3]/100;
    178 break;case 9:LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META(
    179 "\t->Cabel Diag (40nm) pair B: u=%d p=%d\n, "
    180 "Persistent noise present on MDI\n"),l1,l2));l7->pair_state[0] = 
    181 SOC_PORT_CABLE_STATE_UNKNOWN;l7->pair_len[0] = 0;break;default:l7->pair_state
    182 [1] = SOC_PORT_CABLE_STATE_UNKNOWN;l7->pair_len[1] = 0;break;}switch((l12[1]
    183 >>4)&0x000f){case 1:l7->pair_state[2] = SOC_PORT_CABLE_STATE_OK;l7->pair_len[
    184 2] = l12[4]/100;break;case 2:l7->pair_state[2] = SOC_PORT_CABLE_STATE_OPEN;l7
    185 ->pair_len[2] = l12[4]/100;break;case 3:l7->pair_state[2] = 
    186 SOC_PORT_CABLE_STATE_SHORT;l7->pair_len[2] = l12[4]/100;break;case 4:l7->
    187 pair_state[2] = SOC_PORT_CABLE_STATE_CROSSTALK;l7->pair_len[2] = l12[4]/100;
    188 break;case 9:LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META(
    189 "\t->Cabel Diag (40nm) pair C: u=%d p=%d\n, "
    190 "Persistent noise present on MDI\n"),l1,l2));l7->pair_state[0] = 
    191 SOC_PORT_CABLE_STATE_UNKNOWN;l7->pair_len[0] = 0;break;default:l7->pair_state
    192 [2] = SOC_PORT_CABLE_STATE_UNKNOWN;l7->pair_len[2] = 0;break;}switch((l12[1]
    193 >>0)&0x000f){case 1:l7->pair_state[3] = SOC_PORT_CABLE_STATE_OK;l7->pair_len[
    194 3] = l12[5]/100;break;case 2:l7->pair_state[3] = SOC_PORT_CABLE_STATE_OPEN;l7
    195 ->pair_len[3] = l12[5]/100;break;case 3:l7->pair_state[3] = 
    196 SOC_PORT_CABLE_STATE_SHORT;l7->pair_len[3] = l12[5]/100;break;case 4:l7->
    197 pair_state[3] = SOC_PORT_CABLE_STATE_CROSSTALK;l7->pair_len[3] = l12[5]/100;
    198 break;case 9:LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META(
    199 "\t->Cabel Diag (40nm) pair D: u=%d p=%d\n, "
    200 "Persistent noise present on MDI\n"),l1,l2));l7->pair_state[0] = 
    201 SOC_PORT_CABLE_STATE_UNKNOWN;l7->pair_len[0] = 0;break;default:l7->pair_state
    202 [3] = SOC_PORT_CABLE_STATE_UNKNOWN;l7->pair_len[3] = 0;break;}return
    203 SOC_E_NONE;}int phy_ecd_cable_diag_40nm(int l1,soc_port_t l2,
    204 soc_port_cable_diag_t*l7,uint16 l14){unsigned int l16 = 1;int l17 = 
    205 SOC_E_FAIL;do{LOG_VERBOSE(BSL_LS_SOC_PHY,(BSL_META(
    206 "Cable diag 40nm run (attempt %d)\n"),l16));l17 = phy_ecd_cable_diag_run_40nm
    207 (l1,l2,l7,l14);if(l17 == SOC_E_NONE){break;}}while(l16++<30);return l17;}int
    208 phy_ecd_cable_diag_init_40nm(int l1,soc_port_t l2){phy_ctrl_t*l3;uint16 l4;l3
    209 = EXT_PHY_SW_STATE(l1,l2);SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00
    210 ,0x0f00|((0xc0)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((
    211 l1),(l3),0x00,0x0f00|((0xc7)&0xff),0x15,(0xa01a)));SOC_IF_ERROR_RETURN(
    212 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xc8)&0xff),0x15,(0x0300)));
    213 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xc9)&0xff),0x15
    214 ,(0x00ef)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xcb
    215 )&0xff),0x15,(0x1304)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
    216 0x0f00|((0xcc)&0xff),0x15,(0x0180)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
    217 ),(l3),0x00,0x0f00|((0xce)&0xff),0x15,(0x4000)));SOC_IF_ERROR_RETURN(
    218 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xcf)&0xff),0x15,(0x3000)));
    219 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe0)&0xff),0x15
    220 ,(0x0119)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe1
    221 )&0xff),0x15,(0x0202)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
    222 0x0f00|((0xe2)&0xff),0x15,(0x000F)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
    223 ),(l3),0x00,0x0f00|((0xe3)&0xff),0x15,(0x5000)));SOC_IF_ERROR_RETURN(
    224 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe4)&0xff),0x15,(0x738E)));
    225 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe5)&0xff),0x15
    226 ,(0x1000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe6
    227 )&0xff),0x15,(0x1000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
    228 0x0f00|((0xe7)&0xff),0x15,(0xAA00)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
    229 ),(l3),0x00,0x0f00|((0xef)&0xff),0x15,(0x40ff)));SOC_IF_ERROR_RETURN(
    230 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xcd)&0xff),0x15,(0x1000)));
    231 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xcd)&0xff),0x15
    232 ,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe0
    233 )&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
    234 0x0f00|((0xe1)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
    235 ),(l3),0x00,0x0f00|((0xe2)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(
    236 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe3)&0xff),0x15,(0x0000)));
    237 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe4)&0xff),0x15
    238 ,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe5
    239 )&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
    240 0x0f00|((0xe6)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
    241 ),(l3),0x00,0x0f00|((0xe7)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(
    242 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xef)&0xff),0x15,(0x0000)));
    243 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe0)&0xff),0x15
    244 ,(0x0b00)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe1
    245 )&0xff),0x15,(0x313d)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
    246 0x0f00|((0xe2)&0xff),0x15,(0x007c)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
    247 ),(l3),0x00,0x0f00|((0xef)&0xff),0x15,(0x8007)));SOC_IF_ERROR_RETURN(
    248 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xcd)&0xff),0x15,(0x1000)));
    249 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xcd)&0xff),0x15
    250 ,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe0
    251 )&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
    252 0x0f00|((0xe1)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
    253 ),(l3),0x00,0x0f00|((0xe2)&0xff),0x15,(0x0000)));SOC_IF_ERROR_RETURN(
    254 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xef)&0xff),0x15,(0x0000)));
    255 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe0)&0xff),0x15
    256 ,(0x0001)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe1
    257 )&0xff),0x15,(0x0540)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
    258 0x0f00|((0xe2)&0xff),0x15,(0x0e40)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
    259 ),(l3),0x00,0x0f00|((0xe3)&0xff),0x15,(0x0841)));SOC_IF_ERROR_RETURN(
    260 phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe4)&0xff),0x15,(0x1344)));
    261 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe8)&0xff),0x15
    262 ,(0x8760)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xe9
    263 )&0xff),0x15,(0x4b33)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,
    264 0x0f00|((0xea)&0xff),0x15,(0x0400)));SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1
    265 ),(l3),0x00,0x0f00|((0xCD)&0xff),0x15,(0x00D0)));SOC_IF_ERROR_RETURN(
    266 phy_reg_ge_read((l1),(l3),0x00,0x0f00|((0xc0)&0xff),0x15,(&l4)));
    267 SOC_IF_ERROR_RETURN(phy_reg_ge_write((l1),(l3),0x00,0x0f00|((0xc0)&0xff),0x15
    268 ,(0x4000)));return SOC_E_NONE;}