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

phyacd.c (6679B)


      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:        phyacd.c
      8  * Purpose:     PHY ACD 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 #define READ_PHY_EXP_REG(_unit, _phy_ctrl, reg, _val) \
     19                 phy_reg_ge_read((_unit), (_phy_ctrl), 0x00, 0x0f00 | ((reg) & 0xff), 0x15, (_val))
     20 #define WRITE_PHY_EXP_REG(_unit, _phy_ctrl, reg, _val) \
     21                 phy_reg_ge_write((_unit), (_phy_ctrl), 0x00, 0x0f00 | ((reg) & 0xff), \
     22                                                        0x15, (_val))
     23 #define MODIFY_PHY_EXP_REG(_unit, _phy_ctrl, reg, _val, _mask) \
     24                 phy_reg_ge_modify((_unit), (_phy_ctrl), 0x00, 0x0f00 | ((reg) & 0xff), \
     25                                                         0x15, (_val), (_mask))
     26 
     27 int phy_acd_cable_diag_init(int unit,soc_port_t port){phy_ctrl_t*l1;l1 = 
     28 EXT_PHY_SW_STATE(unit,port);SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,
     29 0x90,0x0000));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xC7,0xA01A));
     30 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xC8,0x0000));
     31 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xC9,0x00EF));
     32 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xCC,0x200));
     33 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xCE,0x4000));
     34 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xCF,0x3000));
     35 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE0,0x0010));
     36 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE1,0xD0D));
     37 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE2,0x0));SOC_IF_ERROR_RETURN(
     38 WRITE_PHY_EXP_REG(unit,l1,0xE3,0x1000));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG
     39 (unit,l1,0xE4,0x0));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE7,0xA0))
     40 ;SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xEF,0x409F));
     41 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xCD,0x1000));
     42 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xCD,0x0));SOC_IF_ERROR_RETURN(
     43 WRITE_PHY_EXP_REG(unit,l1,0xE0,0x0));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(
     44 unit,l1,0xE1,0x0));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE2,0x0));
     45 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE3,0x0));SOC_IF_ERROR_RETURN(
     46 WRITE_PHY_EXP_REG(unit,l1,0xE4,0x0));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(
     47 unit,l1,0xE7,0x0));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xEF,0x0));
     48 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE0,0x3600));
     49 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE1,0xC));SOC_IF_ERROR_RETURN(
     50 WRITE_PHY_EXP_REG(unit,l1,0xE1,0x343A));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG
     51 (unit,l1,0xE2,0x0));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE3,0x0000
     52 ));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE4,0x8000));
     53 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE5,0x000C));
     54 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE7,0x0000));
     55 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE9,0x0400));
     56 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xED,0x0000));
     57 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xEF,0xA1BF));
     58 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xCD,0x1000));
     59 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xCD,0x0));SOC_IF_ERROR_RETURN(
     60 WRITE_PHY_EXP_REG(unit,l1,0xE0,0x0));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(
     61 unit,l1,0xE1,0x0));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE2,0x0));
     62 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE3,0x0));SOC_IF_ERROR_RETURN(
     63 WRITE_PHY_EXP_REG(unit,l1,0xE4,0x0));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(
     64 unit,l1,0xE5,0x0));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE7,0x0));
     65 SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xE8,0x0));SOC_IF_ERROR_RETURN(
     66 WRITE_PHY_EXP_REG(unit,l1,0xE9,0x0));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(
     67 unit,l1,0xED,0x0));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG(unit,l1,0xEF,0x0));
     68 return SOC_E_NONE;}static int _phy54680_read_exp_c_array(int unit,phy_ctrl_t*
     69 l1,uint16 l2[]){SOC_IF_ERROR_RETURN(READ_PHY_EXP_REG(unit,l1,0xc0,&l2[0]));
     70 SOC_IF_ERROR_RETURN(READ_PHY_EXP_REG(unit,l1,0xc1,&l2[1]));
     71 SOC_IF_ERROR_RETURN(READ_PHY_EXP_REG(unit,l1,0xc2,&l2[2]));
     72 SOC_IF_ERROR_RETURN(READ_PHY_EXP_REG(unit,l1,0xc3,&l2[3]));
     73 SOC_IF_ERROR_RETURN(READ_PHY_EXP_REG(unit,l1,0xc4,&l2[4]));
     74 SOC_IF_ERROR_RETURN(READ_PHY_EXP_REG(unit,l1,0xc5,&l2[5]));
     75 SOC_IF_ERROR_RETURN(READ_PHY_EXP_REG(unit,l1,0xc6,&l2[6]));
     76 LOG_INFO(BSL_LS_SOC_PHY,(BSL_META_U(unit, 
     77 "u=%d p=%d EXP_C C0=%04x C1=%04x C2=%04x C3=%04x C4=%04x C5=%04x C6=%04x\n"),
     78 unit,l1->port,l2[0],l2[1],l2[2],l2[3],l2[4],l2[5],l2[6]));return SOC_E_NONE;}
     79 static int _exec_ACD(int unit,phy_ctrl_t*l1,int*l3,uint16*l4,int*l5,int*l6){
     80 uint16 l7[7];int l8,l9,l10;l10 = *l3;l7[0] = l7[1] = l7[2] = l7[3] = l7[4] = 
     81 l7[5] = l7[6] = 0;SOC_IF_ERROR_RETURN(_phy54680_read_exp_c_array(unit,l1,l7))
     82 ;if((l7[0]&0x0800)){LOG_INFO(BSL_LS_SOC_PHY,(BSL_META_U(unit, 
     83 "ACD Engine still busy u=%d p=%d\n"),unit,l1->port));}SOC_IF_ERROR_RETURN(
     84 WRITE_PHY_EXP_REG(unit,l1,0xC0,0x2000));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG
     85 (unit,l1,0xC0,0xA000));l9 = 0;for(l8 = 0;l8<300;l8++){SOC_IF_ERROR_RETURN(
     86 _phy54680_read_exp_c_array(unit,l1,l7));if(l7[0]&0x4){l9 = 1;}if(!(l7[0]&
     87 0x0800)){break;}}if(l8>= 300){l10|= 0x0001;
     88 LOG_INFO(BSL_LS_SOC_PHY,(BSL_META_U(unit,
     89 "u=%d p=%d ERROR_ACD_BUSY_ON_DEMAND\n"),unit,l1->port));}if(!l9){l10|= 0x0008;
     90 LOG_INFO(BSL_LS_SOC_PHY, (BSL_META_U(unit,"u=%d p=%d ERROR_ACD_NO_NEW_RESULT\n"),
     91 unit,l1->port));}if(l7[0]&0x8){l10|= 0x0004;
     92 LOG_INFO(BSL_LS_SOC_PHY,(BSL_META_U(unit,
     93 "u=%d p=%d ERROR_ACD_INVALID\n"),unit,l1->port));}*l4 = l7[1];*l5 = (l7[6]+l7[
     94 4])/2;*l6 = (l7[5]+l7[3])/2;return l10;}int phy_acd_cable_diag(int unit,
     95 soc_port_t port,soc_port_cable_diag_t*l11){phy_ctrl_t*l1;uint16 l4 =0;int l3,
     96 l5 =0,l6;l1 = EXT_PHY_SW_STATE(unit,port);l3 = 0;SOC_IF_ERROR_RETURN(
     97 WRITE_PHY_EXP_REG(unit,l1,0xA4,0x0008));SOC_IF_ERROR_RETURN(WRITE_PHY_EXP_REG
     98 (unit,l1,0xA4,0x4008));l3 = _exec_ACD(unit,l1,&l3,&l4,&l5,&l6);if(l3){
     99 LOG_WARN(BSL_LS_SOC_PHY, (BSL_META_U(unit,
    100 "u=%d p=%d cable diag test failed error_flag = 0x%04x\n"),unit,l1->port,l3));
    101 return SOC_E_FAIL;}l11->npairs = 1;l11->fuzz_len = 0;
    102 LOG_INFO(BSL_LS_SOC_PHY,(BSL_META_U(unit,
    103 "u=%d p=%d fault = %x\n"),unit,l1->port,l4));if(l4 == 0x2222){l11->state = 
    104 SOC_PORT_CABLE_STATE_OPEN;l11->pair_state[0] = SOC_PORT_CABLE_STATE_OPEN;l11
    105 ->pair_len[0] = (l5*1000)/1325;}else if(l4 == 0x3333){l11->state = 
    106 SOC_PORT_CABLE_STATE_SHORT;l11->pair_state[0] = SOC_PORT_CABLE_STATE_SHORT;
    107 l11->pair_len[0] = (l5*1000)/1325;}else{l11->state = SOC_PORT_CABLE_STATE_OK;
    108 l11->pair_state[0] = SOC_PORT_CABLE_STATE_OK;l11->pair_len[0] = 0;}return
    109 SOC_E_NONE;}