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

phymod_port_control.c (113242B)


      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:        phymod_ctrl.c
      8  * Purpose:     Interface functions for PHYMOD
      9  */
     10 
     11 #ifdef PHYMOD_SUPPORT
     12 
     13 #include <soc/phy/phymod_port_control.h>
     14 #include <soc/error.h>
     15 
     16 #ifdef _ERR_MSG_MODULE_NAME
     17 #error "_ERR_MSG_MODULE_NAME redefined"
     18 #endif
     19 #define _ERR_MSG_MODULE_NAME BSL_LS_SOC_PHYMOD
     20 
     21 #define LANE_MAP_NOF_LANES (4)
     22 #define PATTERN_MAX_SIZE (8)
     23 
     24 typedef int (*control_set_handler_f)(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2);
     25 typedef int (*control_get_handler_f)(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value);
     26 
     27 int soc_phymod_phy_intf_from_port_intf(int unit, int speed, soc_port_if_t interface,
     28                                        phymod_interface_t *phymod_interface)
     29 {
     30     SOC_INIT_FUNC_DEFS;
     31 
     32     switch(interface) {
     33         case SOC_PORT_IF_SR:
     34             (*phymod_interface) = phymodInterfaceSR;
     35             break ;
     36         case SOC_PORT_IF_SR2:
     37             (*phymod_interface) = phymodInterfaceSR2;
     38             break ;
     39         case SOC_PORT_IF_SR4:
     40             (*phymod_interface) = phymodInterfaceSR4;
     41             break ;
     42         case SOC_PORT_IF_SR10:
     43             (*phymod_interface) = phymodInterfaceSR10;
     44             break ;
     45         case SOC_PORT_IF_DNX_XAUI:
     46             (*phymod_interface) = phymodInterfaceXAUI;
     47              break;
     48         case SOC_PORT_IF_KR:
     49             (*phymod_interface) = phymodInterfaceKR;
     50             break ;
     51         case SOC_PORT_IF_KR2:
     52             (*phymod_interface) = phymodInterfaceKR2;
     53             break ;
     54         case SOC_PORT_IF_KR4:
     55             (*phymod_interface) = phymodInterfaceKR4;
     56             break ;
     57         case SOC_PORT_IF_KR10:
     58             (*phymod_interface) = phymodInterfaceKR10;
     59             break ;
     60         case SOC_PORT_IF_LR10:
     61             (*phymod_interface) = phymodInterfaceLR10;
     62             break ;
     63         case SOC_PORT_IF_CAUI:
     64             (*phymod_interface) = phymodInterfaceCAUI;
     65             break;
     66         case SOC_PORT_IF_XFI2:
     67             (*phymod_interface) = phymodInterfaceSR2;
     68             break;
     69         case SOC_PORT_IF_XFI:
     70             (*phymod_interface) = phymodInterfaceXFI;
     71             break;
     72         case SOC_PORT_IF_SFI:
     73             (*phymod_interface) = phymodInterfaceSFI;
     74             break;
     75         case SOC_PORT_IF_XGMII:
     76             (*phymod_interface) = phymodInterfaceXGMII;
     77              break;
     78         case SOC_PORT_IF_SGMII:
     79             (*phymod_interface) = phymodInterfaceSGMII;
     80              break;
     81         case SOC_PORT_IF_GMII:
     82             (*phymod_interface) = phymodInterface1000X;
     83              break;
     84         case SOC_PORT_IF_RXAUI:
     85             (*phymod_interface) = phymodInterfaceRXAUI;
     86              break;
     87         case SOC_PORT_IF_XLAUI:
     88             (*phymod_interface) = phymodInterfaceXLAUI;
     89             break;
     90         case SOC_PORT_IF_XLAUI2:
     91             (*phymod_interface) = phymodInterfaceXLAUI2;
     92             break;
     93         case SOC_PORT_IF_CR:
     94             (*phymod_interface) = phymodInterfaceCR;
     95              break;
     96         case SOC_PORT_IF_CR2:
     97             (*phymod_interface) = phymodInterfaceCR2;
     98              break;
     99         case SOC_PORT_IF_CR4:
    100             (*phymod_interface) = phymodInterfaceCR4;
    101             break;
    102         case SOC_PORT_IF_CR10:
    103             (*phymod_interface) = phymodInterfaceCR10;
    104              break;
    105         case SOC_PORT_IF_QSGMII:
    106             (*phymod_interface) = phymodInterfaceQSGMII;
    107              break;
    108         case SOC_PORT_IF_ZR:
    109             (*phymod_interface) = phymodInterfaceZR;
    110              break;
    111         case SOC_PORT_IF_LRM:
    112             (*phymod_interface) = phymodInterfaceLRM;
    113              break;
    114         case SOC_PORT_IF_LR:
    115             (*phymod_interface) = phymodInterfaceLR;
    116              break;
    117         case SOC_PORT_IF_LR2:
    118             (*phymod_interface) = phymodInterfaceLR2;
    119              break;
    120         case SOC_PORT_IF_LR4:
    121             (*phymod_interface) = phymodInterfaceLR4;
    122              break;
    123         case SOC_PORT_IF_ILKN:
    124             (*phymod_interface) = phymodInterfaceBypass;
    125              break;
    126         case SOC_PORT_IF_KX:
    127             (*phymod_interface) = phymodInterfaceKX;
    128              break;
    129         case SOC_PORT_IF_ER:
    130             (*phymod_interface) = phymodInterfaceER;
    131             break;
    132         case SOC_PORT_IF_ER2:
    133             (*phymod_interface) = phymodInterfaceER2;
    134             break;
    135         case SOC_PORT_IF_ER4:
    136             (*phymod_interface) = phymodInterfaceER4;
    137             break;
    138         case SOC_PORT_IF_XLPPI:
    139             (*phymod_interface) = phymodInterfaceXLPPI;
    140             break;
    141         case SOC_PORT_IF_VSR:
    142             (*phymod_interface) = phymodInterfaceVSR;
    143             break;
    144         case SOC_PORT_IF_CX:
    145             (*phymod_interface) = phymodInterfaceCX;
    146             break;
    147         case SOC_PORT_IF_CAUI_C2C: 
    148             (*phymod_interface) = phymodInterfaceCAUI4_C2C; 
    149             break;
    150         case SOC_PORT_IF_CAUI_C2M: 
    151             (*phymod_interface) = phymodInterfaceCAUI4_C2M; 
    152             break;
    153         case SOC_PORT_IF_CAUI4:
    154             (*phymod_interface) = phymodInterfaceCAUI4;
    155             break;
    156         case SOC_PORT_IF_COUNT:
    157             (*phymod_interface) = phymodInterfaceCount;
    158             break;
    159         default:
    160             _SOC_EXIT_WITH_ERR(SOC_E_PARAM, (_SOC_MSG("Interface %d not supported in portmod_intf_to"), interface));
    161     }
    162 
    163 exit:
    164         SOC_FUNC_RETURN;
    165 
    166 }
    167 
    168 int soc_phymod_phy_intf_to_port_intf (int unit,
    169                                    phymod_interface_t phymod_interface,
    170                                    soc_port_if_t *interface)
    171 {
    172     SOC_INIT_FUNC_DEFS;
    173 
    174     switch(phymod_interface) {
    175         case phymodInterfaceBypass:
    176             (*interface) = SOC_PORT_IF_ILKN;
    177             break;
    178         case phymodInterfaceSR:
    179             (*interface) = SOC_PORT_IF_SR;
    180             break;
    181         case phymodInterfaceSR2:
    182             (*interface) = SOC_PORT_IF_SR2;
    183             break;
    184         case phymodInterfaceSR4:
    185             (*interface) = SOC_PORT_IF_SR4;
    186             break;
    187         case phymodInterfaceSR10:
    188             (*interface) = SOC_PORT_IF_SR10;
    189             break;
    190         case phymodInterfaceLR10:
    191             (*interface) = SOC_PORT_IF_LR10;
    192             break;
    193         case phymodInterfaceKX:
    194             (*interface) = SOC_PORT_IF_KX;
    195             break;
    196         case phymodInterfaceKX4:
    197         case phymodInterfaceXAUI:
    198             (*interface) = SOC_PORT_IF_DNX_XAUI;
    199             break;
    200         case phymodInterfaceKR:
    201             (*interface) = SOC_PORT_IF_KR;
    202             break;
    203         case phymodInterfaceKR2:
    204             (*interface) = SOC_PORT_IF_KR2;
    205             break;
    206         case phymodInterfaceKR4:
    207             (*interface) = SOC_PORT_IF_KR4;
    208             break;
    209         case phymodInterfaceKR10:
    210             (*interface) = SOC_PORT_IF_KR10;
    211             break;
    212         case phymodInterfaceCR:
    213             (*interface) = SOC_PORT_IF_CR;
    214             break;
    215         case phymodInterfaceCR2:
    216             (*interface) = SOC_PORT_IF_CR2;
    217             break;
    218         case phymodInterfaceCR4:
    219             (*interface) = SOC_PORT_IF_CR4;
    220             break;
    221         case phymodInterfaceCR10:
    222             (*interface) = SOC_PORT_IF_CR10;
    223             break;
    224         case phymodInterfaceXFI:
    225             (*interface) = SOC_PORT_IF_XFI;
    226             break;
    227         case phymodInterfaceSFI:
    228             (*interface) = SOC_PORT_IF_SFI;
    229             break;
    230         case phymodInterfaceXGMII:
    231             (*interface) = SOC_PORT_IF_XGMII;
    232             break;
    233         case phymodInterfaceSGMII:
    234             (*interface) = SOC_PORT_IF_SGMII;
    235              break;
    236         case phymodInterface1000X:
    237             (*interface) = SOC_PORT_IF_GMII;
    238              break;
    239         case phymodInterfaceCX2:
    240             (*interface) = SOC_PORT_IF_RXAUI;
    241              break;
    242         case phymodInterfaceX2:
    243             (*interface) = SOC_PORT_IF_RXAUI;
    244              break;
    245         case phymodInterfaceRXAUI:
    246             (*interface) = SOC_PORT_IF_RXAUI;
    247              break;
    248         case phymodInterfaceXLAUI:
    249             (*interface) = SOC_PORT_IF_XLAUI;
    250             break;
    251         case phymodInterfaceXLAUI2:
    252             (*interface) = SOC_PORT_IF_XLAUI2;
    253             break;
    254         case phymodInterfaceCAUI:
    255             (*interface) = SOC_PORT_IF_CAUI;
    256             break;
    257         case phymodInterfaceCAUI4:
    258             (*interface) = SOC_PORT_IF_CAUI4;
    259             break;
    260         case phymodInterfaceQSGMII:
    261             (*interface) = SOC_PORT_IF_QSGMII;
    262              break;
    263         case phymodInterfaceCX4:
    264             (*interface) = SOC_PORT_IF_CR4;
    265              break;
    266         case phymodInterfaceZR:
    267             (*interface) = SOC_PORT_IF_ZR;
    268              break;
    269         case phymodInterfaceLR:
    270             (*interface) = SOC_PORT_IF_LR;
    271              break;
    272         case phymodInterfaceLR2:
    273             (*interface) = SOC_PORT_IF_LR2;
    274              break;
    275         case phymodInterfaceLR4:
    276             (*interface) = SOC_PORT_IF_LR4;
    277              break;
    278         case phymodInterfaceLRM:
    279             (*interface) = SOC_PORT_IF_LRM;
    280              break;
    281         case phymodInterfaceER:
    282             (*interface) = SOC_PORT_IF_ER;
    283             break;
    284         case phymodInterfaceER2:
    285             (*interface) = SOC_PORT_IF_ER2;
    286             break;
    287         case phymodInterfaceER4:
    288             (*interface) = SOC_PORT_IF_ER4;
    289             break;
    290         case phymodInterfaceXLPPI:
    291             (*interface) = SOC_PORT_IF_XLPPI;
    292              break;
    293         case phymodInterfaceVSR:
    294             (*interface) = SOC_PORT_IF_VSR;
    295              break;
    296         case phymodInterfaceCX:
    297             (*interface) = SOC_PORT_IF_CX;
    298              break;
    299         case phymodInterfaceCAUI4_C2C:
    300             (*interface) = SOC_PORT_IF_CAUI_C2C;
    301             break;
    302         case phymodInterfaceCAUI4_C2M:
    303             (*interface) = SOC_PORT_IF_CAUI_C2M; 
    304             break;
    305         /*
    306               case phymodInterfaceX2:
    307                     (*interface) = SOC_PORT_IF_RXAUI;
    308                     break;
    309              */
    310         default:
    311             _SOC_EXIT_WITH_ERR(SOC_E_PARAM,
    312                 (_SOC_MSG("Phymod Interface %d not supported in soc_phymod_phy_intf_to_port_intf"),
    313                             phymod_interface));
    314     }
    315 
    316 exit:
    317     SOC_FUNC_RETURN;
    318 }
    319 
    320 int soc_phymod_media_type_from_port_intf(int unit, soc_port_if_t interface,
    321                                        phymod_phy_inf_config_t *phy_interface_config)
    322 {
    323     SOC_INIT_FUNC_DEFS;
    324 
    325     PHYMOD_INTF_MODES_FIBER_CLR(phy_interface_config);
    326     PHYMOD_INTF_MODES_COPPER_CLR(phy_interface_config);
    327     PHYMOD_INTF_MODES_BACKPLANE_CLR(phy_interface_config);
    328 
    329     switch(interface) {
    330         case SOC_PORT_IF_SFI:
    331         case SOC_PORT_IF_SR:
    332         case SOC_PORT_IF_SR2:
    333         case SOC_PORT_IF_SR4:
    334         case SOC_PORT_IF_SR10:
    335         case SOC_PORT_IF_LR:
    336         case SOC_PORT_IF_LR2:
    337         case SOC_PORT_IF_LR4:
    338         case SOC_PORT_IF_GMII:
    339         case SOC_PORT_IF_LRM:
    340         case SOC_PORT_IF_ER:
    341         case SOC_PORT_IF_ER2:
    342         case SOC_PORT_IF_ER4:
    343         case SOC_PORT_IF_XFI2:
    344             PHYMOD_INTF_MODES_FIBER_SET(phy_interface_config);
    345             break ;
    346         case SOC_PORT_IF_KR:
    347         case SOC_PORT_IF_KR2:
    348         case SOC_PORT_IF_KR4:
    349         case SOC_PORT_IF_KR10:
    350         case SOC_PORT_IF_CAUI:
    351         case SOC_PORT_IF_CAUI4:
    352         case SOC_PORT_IF_XFI:
    353         case SOC_PORT_IF_SGMII:
    354         case SOC_PORT_IF_QSGMII:
    355         case SOC_PORT_IF_DNX_XAUI:
    356         case SOC_PORT_IF_RXAUI:
    357         case SOC_PORT_IF_XLAUI:
    358         case SOC_PORT_IF_XLAUI2:
    359         case SOC_PORT_IF_XGMII:
    360             PHYMOD_INTF_MODES_BACKPLANE_SET(phy_interface_config);
    361             break;
    362         case SOC_PORT_IF_CR:
    363         case SOC_PORT_IF_CR2:
    364         case SOC_PORT_IF_CR4:
    365         case SOC_PORT_IF_CR10:
    366             PHYMOD_INTF_MODES_COPPER_SET(phy_interface_config);
    367              break;
    368         default:
    369             PHYMOD_INTF_MODES_BACKPLANE_SET(phy_interface_config);
    370     }
    371 
    372     SOC_FUNC_RETURN;
    373 }
    374 
    375 int soc_phymod_intf_mode_from_phymod_intf(int unit, phymod_interface_t phymod_interface,
    376                                        phymod_phy_inf_config_t *phy_interface_config)
    377 {
    378     SOC_INIT_FUNC_DEFS;
    379 
    380     PHYMOD_INTF_MODES_FIBER_CLR(phy_interface_config);
    381     PHYMOD_INTF_MODES_COPPER_CLR(phy_interface_config);
    382     PHYMOD_INTF_MODES_BACKPLANE_CLR(phy_interface_config);
    383 
    384     switch(phymod_interface) {
    385         case phymodInterfaceSFI:
    386         case phymodInterfaceSR:
    387         case phymodInterfaceSR2:
    388         case phymodInterfaceSR4:
    389         case phymodInterfaceSR10:
    390         case phymodInterfaceLR:
    391         case phymodInterfaceLR2:
    392         case phymodInterfaceLR4:
    393         case phymodInterface1000X:
    394         case phymodInterfaceLRM:
    395         case phymodInterfaceER:
    396         case phymodInterfaceER2:
    397         case phymodInterfaceER4:
    398             PHYMOD_INTF_MODES_FIBER_SET(phy_interface_config);
    399             break ;
    400         case phymodInterfaceKR:
    401         case phymodInterfaceKR2:
    402         case phymodInterfaceKR4:
    403         case phymodInterfaceKR10:
    404         case phymodInterfaceCAUI:
    405         case phymodInterfaceCAUI4:
    406         case phymodInterfaceXFI:
    407         case phymodInterfaceSGMII:
    408         case phymodInterfaceQSGMII:
    409         case phymodInterfaceXAUI:
    410         case phymodInterfaceRXAUI:
    411         case phymodInterfaceXLAUI:
    412         case phymodInterfaceXLAUI2:
    413         case phymodInterfaceXGMII:
    414             PHYMOD_INTF_MODES_BACKPLANE_SET(phy_interface_config);
    415             break;
    416         case phymodInterfaceCR:
    417         case phymodInterfaceCR2:
    418         case phymodInterfaceCR4:
    419         case phymodInterfaceCR10:
    420             PHYMOD_INTF_MODES_COPPER_SET(phy_interface_config);
    421              break;
    422         default:
    423             PHYMOD_INTF_MODES_BACKPLANE_SET(phy_interface_config);
    424     }
    425 
    426     SOC_FUNC_RETURN;
    427 }
    428 
    429 int
    430 soc_prbs_poly_to_phymod(uint32 sdk_poly, phymod_prbs_poly_t *phymod_poly){
    431     switch(sdk_poly){
    432     case SOC_PHY_PRBS_POLYNOMIAL_X7_X6_1:
    433         *phymod_poly = phymodPrbsPoly7;
    434         break;
    435     case SOC_PHY_PRBS_POLYNOMIAL_X9_X5_1:
    436         *phymod_poly = phymodPrbsPoly9;
    437         break;
    438     case SOC_PHY_PRBS_POLYNOMIAL_X11_X9_1:
    439         *phymod_poly = phymodPrbsPoly11;
    440         break;
    441     case SOC_PHY_PRBS_POLYNOMIAL_X15_X14_1:
    442         *phymod_poly = phymodPrbsPoly15;
    443         break;
    444     case SOC_PHY_PRBS_POLYNOMIAL_X23_X18_1:
    445         *phymod_poly = phymodPrbsPoly23;
    446         break;
    447     case SOC_PHY_PRBS_POLYNOMIAL_X31_X28_1:
    448         *phymod_poly = phymodPrbsPoly31;
    449         break;
    450     case SOC_PHY_PRBS_POLYNOMIAL_X58_X31_1:
    451         *phymod_poly = phymodPrbsPoly58;
    452         break;
    453     case SOC_PHY_PRBS_POLYNOMIAL_X49_X40_1:
    454         *phymod_poly = phymodPrbsPoly49;
    455         break;
    456     case SOC_PHY_PRBS_POLYNOMIAL_X20_X3_1:
    457         *phymod_poly = phymodPrbsPoly20;
    458         break;
    459     case SOC_PHY_PRBS_POLYNOMIAL_X13_X12_X2_1:
    460         *phymod_poly = phymodPrbsPoly13;
    461         break;
    462     case SOC_PHY_PRBS_POLYNOMIAL_X10_X7_1:
    463         *phymod_poly = phymodPrbsPoly10;
    464         break;
    465     case SOC_PHY_PRBS_POLYNOMIAL_PAM4_13Q:
    466         *phymod_poly = phymodPrbsPolyQ13;
    467         break;
    468     default:
    469         return SOC_E_PARAM;
    470     }
    471     return SOC_E_NONE;
    472 }
    473 
    474 
    475 int
    476 phymod_prbs_poly_to_soc(phymod_prbs_poly_t phymod_poly, uint32 *sdk_poly){
    477     switch(phymod_poly){
    478     case phymodPrbsPoly7:
    479         *sdk_poly = SOC_PHY_PRBS_POLYNOMIAL_X7_X6_1;
    480         break;
    481     case phymodPrbsPoly9:
    482         *sdk_poly = SOC_PHY_PRBS_POLYNOMIAL_X9_X5_1;
    483         break;
    484     case phymodPrbsPoly11:
    485         *sdk_poly = SOC_PHY_PRBS_POLYNOMIAL_X11_X9_1;
    486         break;
    487     case phymodPrbsPoly15:
    488         *sdk_poly = SOC_PHY_PRBS_POLYNOMIAL_X15_X14_1;
    489         break;
    490     case phymodPrbsPoly23:
    491         *sdk_poly = SOC_PHY_PRBS_POLYNOMIAL_X23_X18_1;
    492         break;
    493     case phymodPrbsPoly31:
    494         *sdk_poly = SOC_PHY_PRBS_POLYNOMIAL_X31_X28_1;
    495         break;
    496     case phymodPrbsPoly58:
    497         *sdk_poly = SOC_PHY_PRBS_POLYNOMIAL_X58_X31_1;
    498         break;
    499     case phymodPrbsPoly49:
    500         *sdk_poly = SOC_PHY_PRBS_POLYNOMIAL_X49_X40_1;
    501         break;
    502     case phymodPrbsPoly20:
    503         *sdk_poly = SOC_PHY_PRBS_POLYNOMIAL_X20_X3_1;
    504         break;
    505     case phymodPrbsPoly13:
    506         *sdk_poly = SOC_PHY_PRBS_POLYNOMIAL_X13_X12_X2_1;
    507         break;
    508     case phymodPrbsPoly10:
    509         *sdk_poly = SOC_PHY_PRBS_POLYNOMIAL_X10_X7_1;
    510         break;
    511     case phymodPrbsPolyQ13:
    512         *sdk_poly = SOC_PHY_PRBS_POLYNOMIAL_PAM4_13Q;
    513         break;
    514     default:
    515         return SOC_E_INTERNAL;
    516     }
    517     return SOC_E_NONE;
    518 }
    519 
    520 /****************************************************************************** 
    521   Set controls handlers
    522  */
    523 STATIC int
    524 control_handler_preemphasis_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    525 {
    526     phymod_tx_t phymod_tx, phymod_tx_def;
    527 
    528     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
    529     if (value1 != 0xFFFFFFFF)
    530     {
    531        phymod_tx.pre  = value1 & 0xff;
    532        phymod_tx.main = (value1 >> 8) & 0xff;
    533        phymod_tx.post = (value1 >> 16) & 0xff;  
    534     } else {
    535         SOC_IF_ERROR_RETURN(phymod_phy_media_type_tx_get(phy, phymodMediaTypeChipToChip, &phymod_tx_def));
    536         phymod_tx.pre = phymod_tx_def.pre;
    537 
    538     }
    539     SOC_IF_ERROR_RETURN(phymod_phy_tx_set(phy, &phymod_tx));
    540 
    541     return SOC_E_NONE;
    542 }
    543 
    544 STATIC int
    545 control_handler_tx_fir_mode_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    546 {
    547     phymod_tx_t phymod_tx;
    548 
    549     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
    550 
    551     if (value1 == SOC_PHY_TX_FIR_3TAP_MODE) {
    552         phymod_tx.tap_mode = phymodTxTapMode3Tap;
    553     } else if (value1 == SOC_PHY_TX_FIR_6TAP_MODE) {
    554         phymod_tx.tap_mode = phymodTxTapMode6Tap;
    555     } else {
    556         return SOC_E_PARAM;
    557     }
    558 
    559     SOC_IF_ERROR_RETURN(phymod_phy_tx_set(phy, &phymod_tx));
    560     return SOC_E_NONE;
    561 }
    562 
    563 STATIC int
    564 control_handler_tx_fir_pre2_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    565 {
    566     phymod_tx_t phymod_tx, phymod_tx_def;
    567 
    568     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
    569     if (value1 != 0xFFFFFFFF)
    570     {
    571         phymod_tx.pre2 = value1;
    572     } else {
    573         SOC_IF_ERROR_RETURN(phymod_phy_media_type_tx_get(phy, phymodMediaTypeChipToChip, &phymod_tx_def));
    574         phymod_tx.pre2 = phymod_tx_def.pre2;
    575 
    576     }
    577     SOC_IF_ERROR_RETURN(phymod_phy_tx_set(phy, &phymod_tx));
    578     return SOC_E_NONE;
    579 }
    580 
    581 
    582 STATIC int
    583 control_handler_tx_fir_pre_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    584 {
    585     phymod_tx_t phymod_tx, phymod_tx_def;
    586 
    587     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
    588     if (value1 != 0xFFFFFFFF)
    589     {
    590         phymod_tx.pre = value1; 
    591     } else {
    592         SOC_IF_ERROR_RETURN(phymod_phy_media_type_tx_get(phy, phymodMediaTypeChipToChip, &phymod_tx_def));
    593         phymod_tx.pre = phymod_tx_def.pre;
    594 
    595     }
    596     SOC_IF_ERROR_RETURN(phymod_phy_tx_set(phy, &phymod_tx));
    597     return SOC_E_NONE;
    598 }
    599 
    600 
    601 STATIC int
    602 control_handler_tx_fir_main_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    603 {
    604     phymod_tx_t phymod_tx, phymod_tx_def;
    605 
    606     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
    607     if (value1 != 0xFFFFFFFF)
    608     {
    609         phymod_tx.main = value1; 
    610     } else {
    611         SOC_IF_ERROR_RETURN(phymod_phy_media_type_tx_get(phy, phymodMediaTypeChipToChip, &phymod_tx_def));
    612         phymod_tx.main = phymod_tx_def.main;
    613 
    614     }
    615     SOC_IF_ERROR_RETURN(phymod_phy_tx_set(phy, &phymod_tx));
    616     return SOC_E_NONE;
    617 }
    618 
    619 
    620 STATIC int
    621 control_handler_tx_fir_post_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    622 {
    623     phymod_tx_t phymod_tx, phymod_tx_def;
    624 
    625     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
    626     if (value1 != 0xFFFFFFFF)
    627     {
    628         phymod_tx.post = value1; 
    629     } else {
    630         SOC_IF_ERROR_RETURN(phymod_phy_media_type_tx_get(phy, phymodMediaTypeChipToChip, &phymod_tx_def));
    631         phymod_tx.post = phymod_tx_def.post;
    632 
    633     }
    634     SOC_IF_ERROR_RETURN(phymod_phy_tx_set(phy, &phymod_tx));
    635     return SOC_E_NONE;
    636 }
    637 
    638 
    639 STATIC int
    640 control_handler_tx_fir_post2_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    641 {
    642     phymod_tx_t phymod_tx, phymod_tx_def;
    643 
    644     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
    645     if (value1 != 0xFFFFFFFF)
    646     {
    647         phymod_tx.post2 = value1; 
    648     } else {
    649         SOC_IF_ERROR_RETURN(phymod_phy_media_type_tx_get(phy, phymodMediaTypeChipToChip, &phymod_tx_def));
    650         phymod_tx.post2 = phymod_tx_def.post2;
    651 
    652     }
    653     SOC_IF_ERROR_RETURN(phymod_phy_tx_set(phy, &phymod_tx));
    654     return SOC_E_NONE;
    655 }
    656 
    657 
    658 STATIC int
    659 control_handler_tx_fir_post3_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    660 {
    661     phymod_tx_t phymod_tx, phymod_tx_def;
    662 
    663     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
    664     if (value1 != 0xFFFFFFFF)
    665     {
    666         phymod_tx.post3 = value1; 
    667     } else {
    668         SOC_IF_ERROR_RETURN(phymod_phy_media_type_tx_get(phy, phymodMediaTypeChipToChip, &phymod_tx_def));
    669         phymod_tx.post3 = phymod_tx_def.post3;
    670 
    671     }
    672     SOC_IF_ERROR_RETURN(phymod_phy_tx_set(phy, &phymod_tx));
    673     return SOC_E_NONE;
    674 }
    675 
    676 STATIC int
    677 control_handler_link_training_tx_fir_post_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    678 {
    679     uint8_t tx_post = 0;
    680 
    681     tx_post = (uint8_t) value1;
    682     SOC_IF_ERROR_RETURN(phymod_phy_training_tx_fir_post_set(phy, tx_post));
    683     return SOC_E_NONE;
    684 }
    685 
    686 STATIC int
    687 control_handler_driver_current_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    688 {
    689     phymod_tx_t phymod_tx, phymod_tx_def;
    690 
    691     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
    692     if (value1 != 0xFFFFFFFF)
    693     {
    694         phymod_tx.amp = value1; 
    695     } else {
    696         SOC_IF_ERROR_RETURN(phymod_phy_media_type_tx_get(phy, phymodMediaTypeChipToChip, &phymod_tx_def));
    697         phymod_tx.amp = phymod_tx_def.amp;
    698     }
    699     SOC_IF_ERROR_RETURN(phymod_phy_tx_set(phy, &phymod_tx));
    700     return SOC_E_NONE;
    701 }
    702 
    703 STATIC int
    704 control_handler_tx_fir_drivermode_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    705 {
    706     phymod_tx_t phymod_tx;
    707     int drivermode;
    708 
    709     if (phy == NULL) {
    710         return SOC_E_INTERNAL;
    711     }
    712     if(PHYMOD_INTF_CONFIG_TX_FIR_DRIVERMODE_ENABLE_GET(phy)) {
    713         drivermode = 1;
    714     } else {
    715         drivermode = 0;
    716         PHYMOD_INTF_CONFIG_TX_FIR_DRIVERMODE_ENABLE_SET(phy);
    717     }
    718 
    719     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
    720    
    721     phymod_tx.drivermode = value1; 
    722 
    723     SOC_IF_ERROR_RETURN(phymod_phy_tx_set(phy, &phymod_tx));
    724 
    725     if(drivermode == 0) {
    726         PHYMOD_INTF_CONFIG_TX_FIR_DRIVERMODE_ENABLE_CLR(phy) ;
    727     }
    728 
    729     return SOC_E_NONE;
    730 }
    731 
    732 STATIC int
    733 control_handler_rx_tap_release(int unit, phymod_phy_access_t *phy, uint32 value, uint32 tap)
    734 {
    735     phymod_rx_t phymod_rx;
    736 
    737     /* bounds check "tap" */
    738     if (tap >= COUNTOF(phymod_rx.dfe)) {
    739         return SOC_E_INTERNAL;
    740     }
    741 
    742     SOC_IF_ERROR_RETURN(phymod_phy_rx_get(phy, &phymod_rx));
    743     phymod_rx.dfe[tap].enable = FALSE;
    744     SOC_IF_ERROR_RETURN(phymod_phy_rx_adaptation_resume(phy));
    745 
    746     return SOC_E_NONE;
    747 }
    748 
    749 STATIC int
    750 control_handler_rx_adaptation_resume(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    751 {
    752     if (value1) {
    753         SOC_IF_ERROR_RETURN(phymod_phy_rx_adaptation_resume(phy));
    754     }
    755 
    756     return SOC_E_NONE;
    757 }
    758  
    759 STATIC int 
    760 control_handler_rx_tap_set(int unit, phymod_phy_access_t *phy, uint32 value, uint32 tap)
    761 {
    762     phymod_rx_t phymod_rx;
    763 
    764     /* bounds check "tap" */
    765     if (tap >= COUNTOF(phymod_rx.dfe)) {
    766         return SOC_E_INTERNAL;
    767     }
    768 
    769     SOC_IF_ERROR_RETURN(phymod_phy_rx_get(phy, &phymod_rx));
    770     phymod_rx.dfe[tap].enable = TRUE;
    771     phymod_rx.dfe[tap].value = value;
    772     SOC_IF_ERROR_RETURN(phymod_phy_rx_set(phy, &phymod_rx));
    773 
    774     return SOC_E_NONE;
    775 }
    776 
    777 
    778 STATIC int 
    779 control_handler_pi_control_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    780 {
    781     phymod_tx_override_t tx_override;
    782 
    783     phymod_tx_override_t_init(&tx_override);
    784     tx_override.phase_interpolator.enable = (value1 == 0) ? 0 : 1;
    785     tx_override.phase_interpolator.value = value1;
    786     SOC_IF_ERROR_RETURN(phymod_phy_tx_override_set(phy, &tx_override));
    787 
    788     return SOC_E_NONE;
    789 }
    790 
    791 
    792 STATIC int
    793 control_handler_tx_squelch(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    794 {
    795     phymod_phy_tx_lane_control_t tx_control;
    796 
    797     if (value1 == 1) {
    798         tx_control = phymodTxSquelchOn;
    799     } else {
    800         tx_control = phymodTxSquelchOff;
    801     }
    802     SOC_IF_ERROR_RETURN(phymod_phy_tx_lane_control_set(phy, tx_control));
    803     return SOC_E_NONE;
    804 }
    805 
    806 STATIC int
    807 control_handler_rx_squelch(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    808 {
    809     phymod_phy_rx_lane_control_t rx_control;
    810 
    811     if (value1 == 1) {
    812         rx_control = phymodRxSquelchOn;
    813     } else {
    814         rx_control = phymodRxSquelchOff;
    815     }
    816     SOC_IF_ERROR_RETURN(phymod_phy_rx_lane_control_set(phy, rx_control));
    817     return SOC_E_NONE;
    818 }
    819 
    820 
    821 
    822 STATIC int
    823 control_handler_rx_peak_filter_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    824 {
    825     phymod_rx_t phymod_rx;
    826 
    827 
    828     SOC_IF_ERROR_RETURN(phymod_phy_rx_get(phy, &phymod_rx));
    829     phymod_rx.peaking_filter.enable = TRUE;
    830     phymod_rx.peaking_filter.value = value1;
    831     SOC_IF_ERROR_RETURN(phymod_phy_rx_set(phy, &phymod_rx));
    832 
    833     return SOC_E_NONE;
    834 }
    835 
    836 STATIC int
    837 control_handler_rx_vga_release(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    838 {
    839     phymod_rx_t phymod_rx;
    840 
    841     SOC_IF_ERROR_RETURN(phymod_phy_rx_get(phy, &phymod_rx));
    842     phymod_rx.vga.enable = FALSE;
    843     SOC_IF_ERROR_RETURN(phymod_phy_rx_set(phy, &phymod_rx));
    844     return SOC_E_NONE;
    845 }
    846 
    847 STATIC int 
    848 control_handler_rx_vga_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    849 {
    850     phymod_rx_t phymod_rx;
    851 
    852     SOC_IF_ERROR_RETURN(phymod_phy_rx_get(phy, &phymod_rx));
    853     phymod_rx.vga.enable = TRUE;
    854     phymod_rx.vga.value = value1;
    855     SOC_IF_ERROR_RETURN(phymod_phy_rx_set(phy, &phymod_rx));
    856 
    857     return SOC_E_NONE;
    858 }
    859 
    860 STATIC int 
    861 control_handler_pattern_length_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    862 {
    863     phymod_pattern_t pattern;
    864     uint32 enable;
    865     uint32 pattern_arr[PATTERN_MAX_SIZE];
    866 
    867     pattern.pattern = pattern_arr;
    868 
    869     SOC_IF_ERROR_RETURN(phymod_phy_pattern_config_get(phy, &pattern));
    870     SOC_IF_ERROR_RETURN(phymod_phy_pattern_enable_get(phy, &enable));
    871     pattern.pattern_len = value1;
    872     SOC_IF_ERROR_RETURN(phymod_phy_pattern_enable_set(phy, 1, &pattern));
    873     if (!enable) {
    874         SOC_IF_ERROR_RETURN(phymod_phy_pattern_enable_set(phy, enable, &pattern)); 
    875     }
    876     return SOC_E_NONE;
    877 }
    878 
    879 STATIC int 
    880 control_handler_pattern_enable_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    881 {
    882     phymod_pattern_t pattern;
    883     uint32 enable;
    884     uint32 pattern_arr[PATTERN_MAX_SIZE];
    885 
    886     pattern.pattern = pattern_arr;
    887     enable = value1;
    888     SOC_IF_ERROR_RETURN(phymod_phy_pattern_config_get(phy, &pattern));
    889     SOC_IF_ERROR_RETURN(phymod_phy_pattern_enable_set(phy, enable, &pattern));
    890     return SOC_E_NONE;
    891 }
    892 
    893 STATIC int 
    894 control_handler_pattern_config_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    895 {
    896     phymod_pattern_t pattern;
    897 	uint32 pattern_arr[PATTERN_MAX_SIZE];
    898 
    899     pattern.pattern = pattern_arr;
    900 
    901     SOC_IF_ERROR_RETURN(phymod_phy_pattern_config_get(phy, &pattern));
    902     pattern.pattern[value2] = value1;
    903     SOC_IF_ERROR_RETURN(phymod_phy_pattern_config_set(phy, &pattern));
    904     return SOC_E_NONE;
    905 }
    906 
    907 
    908 STATIC int 
    909 control_handler_prbs_poly_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    910 {
    911     phymod_prbs_t prbs;
    912     uint32_t flags = 0;
    913 
    914     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_get(phy, flags, &prbs));
    915     SOC_IF_ERROR_RETURN(soc_prbs_poly_to_phymod(value1, &prbs.poly));
    916     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_set(phy, flags, &prbs));
    917     return SOC_E_NONE;
    918 }
    919 
    920 
    921 STATIC int
    922 control_handler_prbs_tx_poly_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    923 {
    924     phymod_prbs_t prbs;
    925     uint32_t flags = 0;
    926 
    927     PHYMOD_PRBS_DIRECTION_TX_SET(flags);
    928     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_get(phy, flags, &prbs));
    929     SOC_IF_ERROR_RETURN(soc_prbs_poly_to_phymod(value1, &prbs.poly));
    930     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_set(phy, flags, &prbs));
    931     return SOC_E_NONE;
    932 }
    933 
    934 
    935 STATIC int 
    936 control_handler_prbs_rx_poly_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    937 {
    938     phymod_prbs_t prbs;
    939     uint32_t flags = 0;
    940 
    941     PHYMOD_PRBS_DIRECTION_RX_SET(flags);
    942     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_get(phy, flags, &prbs));
    943     SOC_IF_ERROR_RETURN(soc_prbs_poly_to_phymod(value1, &prbs.poly));
    944     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_set(phy, flags, &prbs));
    945     return SOC_E_NONE;
    946 }
    947 
    948 
    949 STATIC int
    950 control_handler_prbs_tx_invert_data_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    951 {
    952     phymod_prbs_t prbs;
    953     uint32_t flags = 0;
    954 
    955     PHYMOD_PRBS_DIRECTION_TX_SET(flags);
    956     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_get(phy, flags, &prbs));
    957     prbs.invert = value1;
    958     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_set(phy, flags, &prbs));
    959     return SOC_E_NONE;
    960 }
    961 
    962 
    963 STATIC int
    964 control_handler_prbs_rx_invert_data_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    965 {
    966     phymod_prbs_t prbs;
    967     uint32_t flags = 0;
    968 
    969     PHYMOD_PRBS_DIRECTION_RX_SET(flags);
    970     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_get(phy, flags, &prbs));
    971     prbs.invert = value1;
    972     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_set(phy, flags, &prbs));
    973     return SOC_E_NONE;
    974 }
    975 
    976 
    977 STATIC int
    978 control_handler_prbs_tx_enable_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    979 {
    980     uint32_t flags = 0;
    981 
    982     PHYMOD_PRBS_DIRECTION_TX_SET(flags);
    983     SOC_IF_ERROR_RETURN(phymod_phy_prbs_enable_set(phy, flags, value1));
    984     return SOC_E_NONE;
    985 }
    986 
    987 
    988 STATIC int
    989 control_handler_prbs_rx_enable_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
    990 {
    991     uint32_t flags = 0;
    992 
    993     PHYMOD_PRBS_DIRECTION_RX_SET(flags);
    994     SOC_IF_ERROR_RETURN(phymod_phy_prbs_enable_set(phy, flags, value1));
    995     return SOC_E_NONE;
    996 }
    997 
    998 
    999 STATIC int
   1000 control_handler_rx_reset_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1001 {
   1002     phymod_phy_reset_t reset;
   1003 
   1004     SOC_IF_ERROR_RETURN(phymod_phy_reset_get(phy, &reset));
   1005     reset.rx = (value1 == 0)?  phymodResetDirectionOut : phymodResetDirectionIn;
   1006     SOC_IF_ERROR_RETURN(phymod_phy_reset_set(phy, &reset));
   1007 
   1008     return SOC_E_NONE;
   1009 }
   1010 
   1011 
   1012 STATIC int
   1013 control_handler_tx_reset_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1014 {
   1015     phymod_phy_reset_t reset;
   1016 
   1017     SOC_IF_ERROR_RETURN(phymod_phy_reset_get(phy, &reset));
   1018     reset.tx = (value1 == 0)?  phymodResetDirectionOut : phymodResetDirectionIn;
   1019     SOC_IF_ERROR_RETURN(phymod_phy_reset_set(phy, &reset));
   1020 
   1021     return SOC_E_NONE;
   1022 }
   1023 
   1024 
   1025 STATIC int
   1026 control_handler_dsc_dump_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1027 {
   1028     int nof_phys = 1;
   1029 
   1030     SOC_IF_ERROR_RETURN(phymod_diag_dsc(phy, nof_phys));
   1031 
   1032     return SOC_E_NONE;
   1033 
   1034         
   1035 
   1036 }
   1037 
   1038 STATIC int
   1039 control_handler_cl72_enable_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1040 {
   1041     SOC_IF_ERROR_RETURN(phymod_phy_cl72_set(phy, value1));
   1042 
   1043     return SOC_E_NONE;
   1044 }
   1045 
   1046 STATIC int
   1047 control_handler_short_chn_mode_enable_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1048 {
   1049     SOC_IF_ERROR_RETURN(phymod_phy_short_chn_mode_enable_set(phy, value1));
   1050 
   1051     return SOC_E_NONE;
   1052 }
   1053 
   1054 
   1055 STATIC int
   1056 control_handler_lane_map_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1057 {
   1058     phymod_core_access_t core;
   1059     phymod_lane_map_t lane_map;
   1060     uint32 idx;
   1061 
   1062     SOC_IF_ERROR_RETURN(phymod_core_access_t_init(&core));
   1063     core.type = phy->type;
   1064     sal_memcpy(&core.access, &phy->access, sizeof(core.access));
   1065     core.access.lane_mask = 0;
   1066 
   1067     lane_map.num_of_lanes = LANE_MAP_NOF_LANES;
   1068     for (idx=0; idx < LANE_MAP_NOF_LANES; idx++) {
   1069         lane_map.lane_map_rx[idx] = (value1 >> (idx * 4 /*4 bit per lane*/)) & 0xf;
   1070     }
   1071     for (idx=0; idx < LANE_MAP_NOF_LANES; idx++) {
   1072         lane_map.lane_map_tx[idx] = (value1 >> (16 + idx * 4 /*4 bit per lane*/)) & 0xf;
   1073     }
   1074     SOC_IF_ERROR_RETURN(phymod_core_lane_map_set(&core, &lane_map));
   1075     return SOC_E_NONE;
   1076 }
   1077 
   1078 
   1079 STATIC int 
   1080 control_handler_loopback_internal_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1081 {
   1082     SOC_IF_ERROR_RETURN
   1083         (phymod_phy_loopback_set(phy, phymodLoopbackGlobal, value1));
   1084 
   1085     return SOC_E_NONE;
   1086 }
   1087 
   1088 STATIC int 
   1089 control_handler_loopback_pmd_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1090 {
   1091     SOC_IF_ERROR_RETURN
   1092         (phymod_phy_loopback_set(phy, phymodLoopbackGlobalPMD, value1));
   1093 
   1094     return SOC_E_NONE;
   1095 }
   1096 
   1097 
   1098 STATIC int 
   1099 control_handler_loopback_remote_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1100 {
   1101     SOC_IF_ERROR_RETURN
   1102         (phymod_phy_loopback_set(phy, phymodLoopbackRemotePMD, value1));
   1103 
   1104     return SOC_E_NONE;
   1105 }
   1106 
   1107 #if 0
   1108 STATIC int 
   1109 control_handler_loopback_remote_pcs_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1110 {
   1111     SOC_IF_ERROR_RETURN
   1112         (phymod_phy_loopback_set(phy, phymodLoopbackRemotePCS, value1));
   1113 
   1114     return SOC_E_NONE;
   1115 }
   1116 #endif
   1117 
   1118 STATIC int
   1119 control_handler_power_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1120 {
   1121     phymod_phy_power_t      power;
   1122 
   1123     phymod_phy_power_t_init(&power);
   1124     if (value1) {
   1125         power.tx = phymodPowerOn;
   1126         power.rx = phymodPowerOn;
   1127     } 
   1128     else {
   1129         power.tx = phymodPowerOff;
   1130         power.rx = phymodPowerOff;
   1131     }
   1132      SOC_IF_ERROR_RETURN(phymod_phy_power_set(phy, &power));
   1133 
   1134     return SOC_E_NONE;
   1135 }
   1136 
   1137 STATIC int
   1138 control_handler_medium_type_set(int unit, phymod_phy_access_t *phy, uint32 medium_type, uint32 ref_clk)
   1139 {
   1140     phymod_phy_inf_config_t config;
   1141 
   1142     SOC_IF_ERROR_RETURN(phymod_phy_interface_config_get(phy, 0 /* flags */, ref_clk, &config));
   1143     PHYMOD_INTF_MODES_FIBER_CLR(&config); 
   1144     PHYMOD_INTF_MODES_COPPER_CLR(&config); 
   1145     if (medium_type == SOC_PORT_MEDIUM_FIBER) {
   1146         PHYMOD_INTF_MODES_FIBER_SET(&config); 
   1147     } else if (medium_type == SOC_PORT_MEDIUM_COPPER){
   1148         PHYMOD_INTF_MODES_COPPER_SET(&config); 
   1149     }
   1150 
   1151     SOC_IF_ERROR_RETURN(phymod_phy_interface_config_set(phy, 0 /* flags */,&config));
   1152 
   1153     return SOC_E_NONE;
   1154 }
   1155 
   1156 STATIC int
   1157 control_handler_rx_low_freq_filter_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1158 {
   1159     phymod_rx_t phymod_rx;
   1160 
   1161     SOC_IF_ERROR_RETURN(phymod_phy_rx_get(phy, &phymod_rx));
   1162     phymod_rx.low_freq_peaking_filter.enable = TRUE;
   1163     phymod_rx.low_freq_peaking_filter.value = value1;
   1164     SOC_IF_ERROR_RETURN(phymod_phy_rx_set(phy, &phymod_rx));
   1165 
   1166     return SOC_E_NONE;
   1167 }
   1168 
   1169 STATIC int
   1170 control_handler_rx_high_freq_filter_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1171 {
   1172     phymod_rx_t phymod_rx;
   1173 
   1174     SOC_IF_ERROR_RETURN(phymod_phy_rx_get(phy, &phymod_rx));
   1175     phymod_rx.high_freq_peaking_filter.enable = TRUE;
   1176     phymod_rx.high_freq_peaking_filter.value = value1;
   1177     SOC_IF_ERROR_RETURN(phymod_phy_rx_set(phy, &phymod_rx));
   1178 
   1179     return SOC_E_NONE;
   1180 }
   1181 
   1182 
   1183 
   1184 STATIC int
   1185 control_handler_firmware_mode_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1186 {
   1187     phymod_firmware_lane_config_t fw_config;
   1188     int mode = value1;
   1189     int control = value2;
   1190 
   1191     SOC_IF_ERROR_RETURN(phymod_phy_firmware_lane_config_get(phy, &fw_config));
   1192 
   1193     switch (control) {
   1194         case SOC_PHY_CONTROL_FIRMWARE_BR_DFE_ENABLE: 
   1195             if (mode) {
   1196                 fw_config.ForceBrDfe = 1;
   1197                 fw_config.DfeOn = 1;
   1198             } else {
   1199                 fw_config.ForceBrDfe = 0;
   1200             }
   1201             break;
   1202         case SOC_PHY_CONTROL_FIRMWARE_LP_DFE_ENABLE:
   1203             if (mode) {
   1204                 fw_config.LpDfeOn = 1;
   1205                 fw_config.DfeOn = 1;
   1206             } else {
   1207                 fw_config.LpDfeOn = 0;
   1208             }
   1209             break;
   1210         case SOC_PHY_CONTROL_FIRMWARE_CL72_RESTART_TIMEOUT_ENABLE:
   1211             fw_config.Cl72RestTO = mode ? 1 : 0;
   1212             break;
   1213         case SOC_PHY_CONTROL_FIRMWARE_CL72_AUTO_POLARITY_ENABLE:
   1214             fw_config.Cl72AutoPolEn = mode ? 1 : 0;
   1215             break;
   1216         case SOC_PHY_CONTROL_FIRMWARE_DFE_ENABLE:
   1217             fw_config.DfeOn = mode ? 1 : 0;
   1218             break;
   1219         case SOC_PHY_CONTROL_FIRMWARE_MODE:
   1220             /* Select FW parameters according to mode */
   1221             switch (mode) {
   1222                 case SOC_PHY_FIRMWARE_LP_DFE_ENABLE: 
   1223                     fw_config.LpDfeOn = 1;
   1224                     fw_config.DfeOn = 1;
   1225                     break;
   1226                 case SOC_PHY_FIRMWARE_FORCE_BRDFE:
   1227                     fw_config.ForceBrDfe = 1;
   1228                     fw_config.DfeOn = 1;
   1229                     break;
   1230                 case SOC_PHY_FIRMWARE_FORCE_OSDFE:
   1231                 case SOC_PHY_FIRMWARE_DFE_ENABLE:
   1232                     fw_config.DfeOn = 1;
   1233                     fw_config.ForceBrDfe = 0;
   1234                     break;
   1235                 case SOC_PHY_FIRMWARE_SFP_DAC:
   1236                     fw_config.MediaType = phymodFirmwareMediaTypeCopperCable;
   1237                     break;
   1238                 case SOC_PHY_FIRMWARE_XLAUI:
   1239                     fw_config.MediaType = phymodFirmwareMediaTypePcbTraceBackPlane;
   1240                     break;
   1241                 case SOC_PHY_FIRMWARE_SFP_OPT_SR4:
   1242                     fw_config.MediaType = phymodFirmwareMediaTypeOptics;
   1243                     break;
   1244                 case SOC_PHY_FIRMWARE_DEFAULT:
   1245                 default:
   1246                     fw_config.LaneConfigFromPCS = 0;
   1247                     fw_config.DfeOn = 0;
   1248                     fw_config.LpDfeOn = 0;
   1249                     fw_config.ForceBrDfe = 0;
   1250                     break;
   1251             }
   1252             break;
   1253         case SOC_PHY_CONTROL_FIRMWARE_RX_FORCE_EXTENDED_REACH_ENABLE:
   1254             fw_config.ForceExtenedReach = mode ? 1 : 0;
   1255             break;
   1256         case SOC_PHY_CONTROL_FIRMWARE_RX_FORCE_NORMAL_REACH_ENABLE:
   1257             fw_config.ForceNormalReach = mode ? 1 : 0;
   1258             break;
   1259         default:
   1260             break;
   1261     }
   1262 
   1263     SOC_IF_ERROR_RETURN(phymod_phy_firmware_lane_config_set(phy, fw_config));
   1264 
   1265     return SOC_E_NONE;
   1266 }
   1267 
   1268 
   1269 STATIC int
   1270 control_handler_rx_seq_toggle_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1271 {
   1272     SOC_IF_ERROR_RETURN(phymod_phy_rx_restart(phy));
   1273     return SOC_E_NONE;
   1274 }
   1275 
   1276 
   1277 STATIC int
   1278 control_handler_scrambler_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 ref_clk)
   1279 {
   1280     phymod_phy_inf_config_t config;
   1281 
   1282     SOC_IF_ERROR_RETURN(phymod_phy_interface_config_get(phy, 0 /* flags */, ref_clk, &config));
   1283     PHYMOD_INTF_MODES_SCR_SET(&config);
   1284     SOC_IF_ERROR_RETURN(phymod_phy_interface_config_set(phy, PHYMOD_INTF_F_DONT_OVERIDE_TX_PARAMS, &config));
   1285 
   1286     return SOC_E_NONE;
   1287 }
   1288 
   1289 STATIC int
   1290 control_handler_fec_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 ref_clk)
   1291 {
   1292     
   1293     SOC_IF_ERROR_RETURN(phymod_phy_fec_enable_set(phy, value1));
   1294     return SOC_E_NONE;
   1295 }
   1296 
   1297 STATIC int 
   1298 control_handler_fec_override_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1299 {
   1300     
   1301     SOC_IF_ERROR_RETURN(phymod_phy_fec_override_set(phy, value1));
   1302     return SOC_E_NONE;
   1303 }
   1304 
   1305 STATIC int 
   1306 control_handler_tx_polarity_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1307 {
   1308     phymod_polarity_t    polarity;
   1309 
   1310     SOC_IF_ERROR_RETURN(phymod_phy_polarity_get(phy, &polarity));
   1311     polarity.tx_polarity = value1;
   1312     SOC_IF_ERROR_RETURN(phymod_phy_polarity_set(phy, &polarity));
   1313 
   1314     return SOC_E_NONE;
   1315 }
   1316 
   1317 
   1318 STATIC int 
   1319 control_handler_rx_polarity_set(int unit, phymod_phy_access_t *phy, uint32 value1, uint32 value2)
   1320 {
   1321     phymod_polarity_t    polarity;
   1322 
   1323     SOC_IF_ERROR_RETURN(phymod_phy_polarity_get(phy, &polarity));
   1324     polarity.rx_polarity = value1;
   1325     SOC_IF_ERROR_RETURN(phymod_phy_polarity_set(phy, &polarity));
   1326 
   1327     return SOC_E_NONE;
   1328 }
   1329 
   1330 STATIC int
   1331 control_handler_pam4_tx_pattern_set(int unit, phymod_phy_access_t *phy,  uint32 tx_pattern, uint32 param2)
   1332 {
   1333     if (tx_pattern == SOC_PHY_PAM4_TX_PATTERN_OFF) {
   1334         SOC_IF_ERROR_RETURN(phymod_phy_PAM4_tx_pattern_enable_set(phy, phymod_PAM4TxPattern_JP03B, 0));
   1335         SOC_IF_ERROR_RETURN(phymod_phy_PAM4_tx_pattern_enable_set(phy, phymod_PAM4TxPattern_Linear, 0));
   1336     } else if (tx_pattern == SOC_PHY_PAM4_TX_PATTERN_JP03B) {
   1337         SOC_IF_ERROR_RETURN(phymod_phy_PAM4_tx_pattern_enable_set(phy, phymod_PAM4TxPattern_JP03B, 1));
   1338     } else if (tx_pattern == SOC_PHY_PAM4_TX_PATTERN_LINEAR) {
   1339         SOC_IF_ERROR_RETURN(phymod_phy_PAM4_tx_pattern_enable_set(phy, phymod_PAM4TxPattern_Linear, 1));
   1340     } else {
   1341       return SOC_E_PARAM;
   1342     }
   1343     return SOC_E_NONE;
   1344 }
   1345 
   1346 STATIC int
   1347 control_handler_pcs_mode_set (int unit, phymod_phy_access_t *phy,  uint32 pcs_mode, uint32 param2)
   1348 {
   1349     phymod_phy_inf_config_t config;
   1350 
   1351     SOC_IF_ERROR_RETURN(phymod_phy_interface_config_get(phy, 0 /* flags */, param2, &config));
   1352 
   1353     if (phy->type == phymodDispatchTypeTsce) {
   1354         if (PHYMOD_INTF_MODES_HIGIG_GET(&config) && 
   1355             ((config.data_rate == 40000) || (config.data_rate == 42000))) {
   1356             if (pcs_mode == SOC_PHY_CONTROL_PCS_MODE_BRCM) {
   1357                 config.interface_type = phymodInterfaceXGMII;
   1358             } else {
   1359                 if (config.interface_type == phymodInterfaceXGMII) {
   1360                     config.interface_type = phymodInterfaceKR4;
   1361                 }
   1362             }
   1363         } else {
   1364             return SOC_E_UNAVAIL;
   1365         }
   1366     } else {
   1367         return SOC_E_UNAVAIL;
   1368     }
   1369     SOC_IF_ERROR_RETURN(phymod_phy_interface_config_set(phy, 0, &config));
   1370 
   1371     return SOC_E_NONE;
   1372 }
   1373 
   1374 STATIC int
   1375 control_handler_tx_pam4_precoder_enable_set(int unit, phymod_phy_access_t *phy,  uint32 value1, uint32 value2)
   1376 {
   1377     uint32_t  cl72_en = 0;
   1378 
   1379     /* first if link training is enabled */
   1380     SOC_IF_ERROR_RETURN(phymod_phy_cl72_get(phy, &cl72_en));
   1381 
   1382     if (cl72_en) {
   1383         LOG_ERROR(BSL_LS_SOC_COMMON,
   1384                   (BSL_META_U(unit,
   1385                   "ERROR: feature not supported with link training on \n")));
   1386         return SOC_E_FAIL;
   1387 
   1388     } else {
   1389         SOC_IF_ERROR_RETURN(phymod_phy_tx_pam4_precoder_enable_set(phy, (int) value1));
   1390     }
   1391     return SOC_E_NONE;
   1392 }
   1393 
   1394 STATIC int
   1395 control_handler_lp_tx_precoder_enable_set(int unit, phymod_phy_access_t *phy,  uint32 value1, uint32 value2)
   1396 {
   1397     phymod_firmware_lane_config_t fw_config;
   1398     uint32_t  cl72_en = 0;
   1399 
   1400     /* first if link training is enabled */
   1401     SOC_IF_ERROR_RETURN(phymod_phy_cl72_get(phy, &cl72_en));
   1402 
   1403     if (cl72_en) {
   1404         LOG_ERROR(BSL_LS_SOC_COMMON,
   1405                   (BSL_META_U(unit,
   1406                   "ERROR: feature not supported with link training on \n")));
   1407         return SOC_E_FAIL;
   1408     } else {
   1409         SOC_IF_ERROR_RETURN(phymod_phy_firmware_lane_config_get(phy, &fw_config));
   1410         fw_config.LpPrecoderEnabled = value1;
   1411         SOC_IF_ERROR_RETURN(phymod_phy_firmware_lane_config_set(phy, fw_config));
   1412     }
   1413     return SOC_E_NONE;
   1414 }
   1415 
   1416 STATIC int
   1417 control_handler_channel_loss_hint_set(int unit, phymod_phy_access_t *phy,  uint32 value1, uint32 value2)
   1418 {
   1419     SOC_IF_ERROR_RETURN(phymod_phy_channel_loss_hint_set(phy, value1));
   1420     return SOC_E_NONE;
   1421 }
   1422 
   1423 
   1424 
   1425 
   1426 /****************************************************************************** 
   1427  Get controls handlers
   1428  */
   1429 STATIC int
   1430 control_handler_preemphasis_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1431 {
   1432     phymod_tx_t phymod_tx;
   1433 
   1434     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
   1435     /* the shift is chip dependent.  Need to check later for other chips  */
   1436     *value = phymod_tx.pre  | (phymod_tx.main << 8) | (phymod_tx.post << 16);
   1437 
   1438     return SOC_E_NONE;
   1439 }
   1440 STATIC int
   1441 control_handler_tx_fir_mode_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1442 {
   1443     phymod_tx_t phymod_tx;
   1444 
   1445     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
   1446 
   1447     if (phymod_tx.tap_mode == phymodTxTapMode3Tap) {
   1448         *value = SOC_PHY_TX_FIR_3TAP_MODE;
   1449     } else if (phymod_tx.tap_mode == phymodTxTapMode6Tap) {
   1450         *value = SOC_PHY_TX_FIR_6TAP_MODE;
   1451     } else {
   1452       return SOC_E_PARAM;
   1453     }
   1454 
   1455 
   1456     return SOC_E_NONE;
   1457 }
   1458 
   1459 
   1460 STATIC int
   1461 control_handler_tx_fir_pre2_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1462 {
   1463     phymod_tx_t phymod_tx;
   1464 
   1465     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
   1466     *value = phymod_tx.pre2;
   1467     return SOC_E_NONE;
   1468 }
   1469 
   1470 STATIC int
   1471 control_handler_tx_fir_pre_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1472 {
   1473     phymod_tx_t phymod_tx;
   1474 
   1475     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
   1476     *value = phymod_tx.pre;
   1477     return SOC_E_NONE;
   1478 }
   1479 
   1480 
   1481 STATIC int
   1482 control_handler_tx_fir_main_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1483 {
   1484     phymod_tx_t phymod_tx;
   1485 
   1486     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
   1487     *value = phymod_tx.main;
   1488     return SOC_E_NONE;
   1489 }
   1490 
   1491 
   1492 STATIC int
   1493 control_handler_tx_fir_post_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1494 {
   1495     phymod_tx_t phymod_tx;
   1496 
   1497     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
   1498     *value = phymod_tx.post;
   1499     return SOC_E_NONE;
   1500 }
   1501 
   1502 
   1503 STATIC int
   1504 control_handler_tx_fir_post2_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1505 {
   1506     phymod_tx_t phymod_tx;
   1507 
   1508     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
   1509     *value = phymod_tx.post2;
   1510     return SOC_E_NONE;
   1511 }
   1512 
   1513 
   1514 STATIC int
   1515 control_handler_tx_fir_post3_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1516 {
   1517     phymod_tx_t phymod_tx;
   1518 
   1519     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
   1520     *value = phymod_tx.post3;
   1521     return SOC_E_NONE;
   1522 }
   1523 
   1524 
   1525 
   1526 STATIC int
   1527 control_handler_driver_current_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1528 {
   1529     phymod_tx_t phymod_tx;
   1530 
   1531     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
   1532     *value = phymod_tx.amp;
   1533     return SOC_E_NONE;
   1534 }
   1535 
   1536 STATIC int
   1537 control_handler_tx_fir_drivermode_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1538 {
   1539     phymod_tx_t phymod_tx;
   1540 
   1541     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy, &phymod_tx));
   1542     *value = phymod_tx.drivermode;
   1543     return SOC_E_NONE;
   1544 }
   1545 
   1546 STATIC int 
   1547 control_handler_rx_tap_get(int unit, phymod_phy_access_t *phy, uint32 tap, uint32 *value)
   1548 {
   1549     phymod_rx_t phymod_rx;
   1550 
   1551     /* bounds check "tap" */
   1552     if (tap >= COUNTOF(phymod_rx.dfe)) {
   1553         return SOC_E_INTERNAL;
   1554     }
   1555 
   1556     SOC_IF_ERROR_RETURN(phymod_phy_rx_get(phy, &phymod_rx));
   1557     /* use phymod_rx.dfe[tap].enable as the indicator for PAM4 mode for BH*/
   1558     if ((tap == 0) && !phymod_rx.dfe[tap].enable) {
   1559         PHYMOD_DEBUG_ERROR(("ERROR :: DFE1 is not supported on PAM4 mode \n"));
   1560         return SOC_E_PARAM;
   1561     }
   1562     *value = phymod_rx.dfe[tap].value;
   1563 
   1564     return SOC_E_NONE;
   1565 }
   1566 
   1567 
   1568 STATIC int 
   1569 control_handler_pi_control_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1570 {
   1571     phymod_tx_override_t tx_override;
   1572 
   1573     SOC_IF_ERROR_RETURN(phymod_phy_tx_override_get(phy, &tx_override));
   1574     *value = tx_override.phase_interpolator.value;
   1575 
   1576     return SOC_E_NONE;
   1577 }
   1578 
   1579 
   1580 STATIC int
   1581 control_handler_tx_squelch_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1582 {
   1583     phymod_phy_tx_lane_control_t  tx_control;
   1584 
   1585     tx_control = phymodTxSquelchOn;
   1586     SOC_IF_ERROR_RETURN(phymod_phy_tx_lane_control_get(phy, &tx_control));
   1587     *value = (tx_control == phymodTxSquelchOn)? 1 : 0;
   1588 
   1589     return SOC_E_NONE;
   1590 }
   1591 
   1592 STATIC int
   1593 control_handler_rx_squelch_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1594 {
   1595     phymod_phy_rx_lane_control_t  rx_control;
   1596 
   1597     rx_control = phymodRxSquelchOn;
   1598     SOC_IF_ERROR_RETURN(phymod_phy_rx_lane_control_get(phy, &rx_control));
   1599     *value = (rx_control == phymodRxSquelchOn)? 1 : 0;
   1600 
   1601     return SOC_E_NONE;
   1602 }
   1603 
   1604 STATIC int
   1605 control_handler_power_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1606 {
   1607     phymod_phy_power_t      power;
   1608 
   1609     phymod_phy_power_t_init(&power);
   1610     SOC_IF_ERROR_RETURN(phymod_phy_power_get(phy, &power));
   1611 
   1612     if(power.tx == phymodPowerOn && power.rx == phymodPowerOn) {
   1613         *value = 1;
   1614     } else {
   1615         *value = 0;
   1616     }
   1617 
   1618     return SOC_E_NONE;
   1619 }
   1620 
   1621 STATIC int
   1622 control_handler_medium_type_get(int unit, phymod_phy_access_t *phy, uint32 ref_clk, uint32 *value)
   1623 {
   1624     phymod_phy_inf_config_t config;
   1625 
   1626     SOC_IF_ERROR_RETURN(phymod_phy_interface_config_get(phy, 0 /* flags */, ref_clk, &config));
   1627     if (PHYMOD_INTF_MODES_FIBER_GET(&config)) {
   1628         *value = SOC_PORT_MEDIUM_FIBER; 
   1629     } else if (PHYMOD_INTF_MODES_COPPER_GET(&config)) {
   1630         *value = SOC_PORT_MEDIUM_COPPER; 
   1631     } else {
   1632         *value = SOC_PORT_MEDIUM_NONE;
   1633     }
   1634     return SOC_E_NONE;
   1635 }
   1636 
   1637 
   1638 
   1639 STATIC int
   1640 control_handler_rx_peak_filter_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1641 {
   1642     phymod_rx_t phymod_rx;
   1643 
   1644     SOC_IF_ERROR_RETURN(phymod_phy_rx_get(phy, &phymod_rx));
   1645     *value = phymod_rx.peaking_filter.value;
   1646 
   1647     return SOC_E_NONE;
   1648 }
   1649 
   1650 
   1651 STATIC int 
   1652 control_handler_rx_vga_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1653 {
   1654     phymod_rx_t phymod_rx;
   1655 
   1656     SOC_IF_ERROR_RETURN(phymod_phy_rx_get(phy, &phymod_rx));
   1657     *value = phymod_rx.vga.value;
   1658 
   1659     return SOC_E_NONE;
   1660 }
   1661 
   1662 STATIC int 
   1663 control_handler_pattern_length_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1664 {
   1665     phymod_pattern_t pattern;
   1666     uint32 pattern_arr[PATTERN_MAX_SIZE];
   1667 
   1668     pattern.pattern = pattern_arr;
   1669 
   1670     SOC_IF_ERROR_RETURN(phymod_phy_pattern_config_get(phy, &pattern));
   1671     *value = pattern.pattern_len;
   1672     return SOC_E_NONE;
   1673 }
   1674 
   1675 STATIC int 
   1676 control_handler_pattern_enable_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1677 {
   1678     phymod_pattern_t pattern;
   1679     uint32 enable;
   1680     uint32 pattern_arr[PATTERN_MAX_SIZE];
   1681 
   1682     pattern.pattern = pattern_arr;
   1683     SOC_IF_ERROR_RETURN(phymod_phy_pattern_config_get(phy, &pattern));
   1684     SOC_IF_ERROR_RETURN(phymod_phy_pattern_enable_get(phy, &enable));
   1685     *value = enable;
   1686     return SOC_E_NONE;
   1687 }
   1688 
   1689 STATIC int 
   1690 control_handler_pattern_config_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1691 {
   1692     phymod_pattern_t pattern;
   1693 	uint32 pattern_arr[PATTERN_MAX_SIZE];
   1694 
   1695     pattern.pattern = pattern_arr;
   1696 
   1697     SOC_IF_ERROR_RETURN(phymod_phy_pattern_config_get(phy, &pattern));
   1698     *value = pattern.pattern[param];
   1699     return SOC_E_NONE;
   1700 }
   1701 
   1702 STATIC int 
   1703 control_handler_prbs_poly_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1704 {
   1705     phymod_prbs_t prbs;
   1706     uint32_t flags = 0;
   1707 
   1708     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_get(phy, flags, &prbs));
   1709     SOC_IF_ERROR_RETURN(phymod_prbs_poly_to_soc(prbs.poly, value));
   1710     return SOC_E_NONE;
   1711 }
   1712 
   1713 
   1714 STATIC int
   1715 control_handler_prbs_tx_poly_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1716 {
   1717     phymod_prbs_t prbs;
   1718     uint32_t flags = 0;
   1719 
   1720     PHYMOD_PRBS_DIRECTION_TX_SET(flags);
   1721     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_get(phy, flags, &prbs));
   1722     SOC_IF_ERROR_RETURN(phymod_prbs_poly_to_soc(prbs.poly, value));
   1723     return SOC_E_NONE;
   1724 }
   1725 
   1726 
   1727 STATIC int 
   1728 control_handler_prbs_rx_poly_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1729 {
   1730     phymod_prbs_t prbs;
   1731     uint32_t flags = 0;
   1732 
   1733     PHYMOD_PRBS_DIRECTION_RX_SET(flags);
   1734     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_get(phy, flags, &prbs));
   1735     SOC_IF_ERROR_RETURN(phymod_prbs_poly_to_soc(prbs.poly, value));
   1736     return SOC_E_NONE;
   1737 }
   1738 
   1739 
   1740 STATIC int
   1741 control_handler_prbs_tx_invert_data_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1742 {
   1743     phymod_prbs_t prbs;
   1744     uint32_t flags = 0;
   1745 
   1746     PHYMOD_PRBS_DIRECTION_TX_SET(flags);
   1747     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_get(phy, flags, &prbs));
   1748     *value = prbs.invert;
   1749     return SOC_E_NONE;
   1750 }
   1751 
   1752 
   1753 STATIC int
   1754 control_handler_prbs_rx_invert_data_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1755 {
   1756     phymod_prbs_t prbs;
   1757     uint32_t flags = 0;
   1758 
   1759     PHYMOD_PRBS_DIRECTION_RX_SET(flags);
   1760     SOC_IF_ERROR_RETURN(phymod_phy_prbs_config_get(phy, flags, &prbs));
   1761     *value = prbs.invert;
   1762     return SOC_E_NONE;
   1763 }
   1764 
   1765 
   1766 STATIC int
   1767 control_handler_prbs_tx_enable_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1768 {
   1769     uint32_t flags = 0;
   1770 
   1771     PHYMOD_PRBS_DIRECTION_TX_SET(flags);
   1772     SOC_IF_ERROR_RETURN(phymod_phy_prbs_enable_get(phy, flags, value));
   1773     return SOC_E_NONE;
   1774 }
   1775 
   1776 
   1777 STATIC int
   1778 control_handler_prbs_rx_enable_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1779 {
   1780     uint32_t flags = 0;
   1781 
   1782     PHYMOD_PRBS_DIRECTION_RX_SET(flags);
   1783     SOC_IF_ERROR_RETURN(phymod_phy_prbs_enable_get(phy, flags, value));
   1784     return SOC_E_NONE;
   1785 }
   1786 
   1787 
   1788 
   1789 STATIC int
   1790 control_handler_prbs_rx_status_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1791 {
   1792     uint32_t flags = PHYMOD_PRBS_STATUS_F_CLEAR_ON_READ;
   1793     phymod_prbs_status_t status;
   1794 
   1795     SOC_IF_ERROR_RETURN(phymod_phy_prbs_status_get(phy, flags, &status));
   1796     if (status.prbs_lock==0){
   1797         *value = -1;
   1798     } else if (status.prbs_lock_loss) {
   1799         *value = -2;
   1800     } else{
   1801         *value = status.error_count;
   1802     }
   1803     return SOC_E_NONE;
   1804 }
   1805 
   1806 STATIC int
   1807 control_handler_cl72_enable_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1808 {
   1809     SOC_IF_ERROR_RETURN(phymod_phy_cl72_get(phy, value));
   1810 
   1811     return SOC_E_NONE;
   1812 }
   1813 
   1814 STATIC int
   1815 control_handler_short_chn_mode_enable_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1816 {
   1817     uint32_t status = 0;
   1818 
   1819     SOC_IF_ERROR_RETURN(phymod_phy_short_chn_mode_enable_get(phy, value, &status));
   1820 
   1821     return SOC_E_NONE;
   1822 }
   1823 
   1824 STATIC int
   1825 control_handler_short_chn_mode_status_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1826 {
   1827     uint32_t enable = 0;
   1828 
   1829     SOC_IF_ERROR_RETURN(phymod_phy_short_chn_mode_enable_get(phy, &enable, value));
   1830 
   1831     return SOC_E_NONE;
   1832 }
   1833 
   1834 STATIC int
   1835 control_handler_rx_signal_detect_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1836 {
   1837     SOC_IF_ERROR_RETURN(phymod_phy_rx_signal_detect_get(phy, value));
   1838 
   1839     return SOC_E_NONE;
   1840 }
   1841 
   1842 
   1843 
   1844 STATIC int
   1845 control_handler_cl72_status_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1846 {
   1847     phymod_cl72_status_t status;
   1848     SOC_IF_ERROR_RETURN(phymod_phy_cl72_status_get(phy, &status));
   1849     *value = status.locked;
   1850 
   1851     return SOC_E_NONE;
   1852 }
   1853 
   1854 
   1855 STATIC int
   1856 control_handler_lane_map_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1857 {
   1858     phymod_core_access_t core;
   1859     phymod_lane_map_t lane_map;
   1860     uint32 idx;
   1861 
   1862     SOC_IF_ERROR_RETURN(phymod_core_access_t_init(&core));
   1863     core.type = phy->type;
   1864     sal_memcpy(&core.access, &phy->access, sizeof(core.access));
   1865     core.access.lane_mask = 0;
   1866     *value = 0;
   1867     sal_memset(&lane_map, 0, sizeof(phymod_lane_map_t));
   1868 
   1869     SOC_IF_ERROR_RETURN(phymod_core_lane_map_get(&core, &lane_map));
   1870     if(lane_map.num_of_lanes != LANE_MAP_NOF_LANES){
   1871         return SOC_E_INTERNAL;
   1872     }
   1873     for (idx=0; idx < LANE_MAP_NOF_LANES; idx++) {
   1874         *value += ((lane_map.lane_map_rx[idx] & 0xf) << (idx * 4));
   1875     }
   1876     for (idx=0; idx < LANE_MAP_NOF_LANES; idx++) {
   1877         *value += ((lane_map.lane_map_tx[idx] & 0xf)<< (idx * 4 + 16));
   1878     }
   1879     
   1880     return SOC_E_NONE;
   1881 }
   1882 
   1883 
   1884 
   1885 STATIC int 
   1886 control_handler_loopback_internal_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1887 {
   1888     SOC_IF_ERROR_RETURN
   1889         (phymod_phy_loopback_get(phy, phymodLoopbackGlobal, value));
   1890 
   1891     return SOC_E_NONE;
   1892 }
   1893 
   1894 STATIC int 
   1895 control_handler_loopback_pmd_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1896 {
   1897     SOC_IF_ERROR_RETURN
   1898         (phymod_phy_loopback_get(phy, phymodLoopbackGlobalPMD, value));
   1899 
   1900     return SOC_E_NONE;
   1901 }
   1902 
   1903 STATIC int 
   1904 control_handler_loopback_remote_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1905 {
   1906     SOC_IF_ERROR_RETURN
   1907         (phymod_phy_loopback_get(phy, phymodLoopbackRemotePMD, value));
   1908 
   1909     return SOC_E_NONE;
   1910 }
   1911 
   1912 #if 0
   1913 STATIC int 
   1914 control_handler_loopback_remote_pcs_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1915 {
   1916     SOC_IF_ERROR_RETURN
   1917         (phymod_phy_loopback_get(phy, phymodLoopbackRemotePCS, value));
   1918 
   1919     return SOC_E_NONE;
   1920 }
   1921 #endif
   1922 
   1923 STATIC int
   1924 control_handler_rx_low_freq_filter_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1925 {
   1926     phymod_rx_t phymod_rx;
   1927 
   1928     SOC_IF_ERROR_RETURN(phymod_phy_rx_get(phy, &phymod_rx));
   1929     *value = phymod_rx.low_freq_peaking_filter.value;
   1930 
   1931     return SOC_E_NONE;
   1932 }
   1933 
   1934 STATIC int
   1935 control_handler_rx_high_freq_filter_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1936 {
   1937     phymod_rx_t phymod_rx;
   1938 
   1939     SOC_IF_ERROR_RETURN(phymod_phy_rx_get(phy, &phymod_rx));
   1940     *value = phymod_rx.high_freq_peaking_filter.value;
   1941 
   1942     return SOC_E_NONE;
   1943 }
   1944 
   1945 
   1946 STATIC int
   1947 control_handler_scrambler_get(int unit, phymod_phy_access_t *phy, uint32 ref_clk, uint32 *value)
   1948 {
   1949     phymod_phy_inf_config_t config;
   1950 
   1951     SOC_IF_ERROR_RETURN(phymod_phy_interface_config_get(phy, 0 /* flags */, ref_clk, &config));
   1952     *value = PHYMOD_INTF_MODES_SCR_GET(&config); 
   1953 
   1954     return SOC_E_NONE;
   1955 }
   1956 
   1957 STATIC int
   1958 control_handler_fec_get(int unit, phymod_phy_access_t *phy, uint32 ref_clk, uint32 *value)
   1959 {
   1960     uint32_t               enable = *value;
   1961 
   1962     SOC_IF_ERROR_RETURN(phymod_phy_fec_enable_get(phy,  &enable));
   1963     *value = enable; 
   1964 
   1965     return SOC_E_NONE;
   1966 }
   1967 
   1968 STATIC int
   1969 control_handler_fec_override_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1970 {
   1971 
   1972     SOC_IF_ERROR_RETURN(phymod_phy_fec_override_get(phy, value));
   1973 
   1974     return SOC_E_NONE;
   1975 }
   1976 
   1977 STATIC int
   1978 control_handler_firmware_mode_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   1979 {
   1980     phymod_firmware_lane_config_t fw_config;
   1981     int control = param;
   1982 
   1983     SOC_IF_ERROR_RETURN(phymod_phy_firmware_lane_config_get(phy, &fw_config));
   1984 
   1985     switch (control) {
   1986     case SOC_PHY_CONTROL_FIRMWARE_BR_DFE_ENABLE:
   1987         *value = fw_config.DfeOn && fw_config.ForceBrDfe ? 1 : 0;
   1988         break;
   1989     case SOC_PHY_CONTROL_FIRMWARE_LP_DFE_ENABLE:
   1990         *value = fw_config.DfeOn && fw_config.LpDfeOn ? 1 : 0;
   1991         break;
   1992     case SOC_PHY_CONTROL_FIRMWARE_DFE_ENABLE:
   1993         *value = fw_config.DfeOn ? 1 : 0;
   1994         break;
   1995     case SOC_PHY_CONTROL_FIRMWARE_CL72_RESTART_TIMEOUT_ENABLE:
   1996         *value = fw_config.Cl72RestTO ? 1 : 0;
   1997         break;
   1998     case SOC_PHY_CONTROL_FIRMWARE_CL72_AUTO_POLARITY_ENABLE:
   1999         *value = fw_config.Cl72AutoPolEn ? 1 : 0;
   2000         break;
   2001     case SOC_PHY_CONTROL_FIRMWARE_MODE:
   2002         if ((fw_config.LpDfeOn) && (fw_config.DfeOn)) {
   2003             *value = SOC_PHY_FIRMWARE_LP_DFE_ENABLE;
   2004         } else if ((fw_config.ForceBrDfe) && (fw_config.DfeOn)) {
   2005             *value = SOC_PHY_FIRMWARE_FORCE_BRDFE;
   2006         } else if (fw_config.DfeOn) {
   2007             *value = SOC_PHY_FIRMWARE_DFE_ENABLE;
   2008         } else {
   2009             *value = SOC_PHY_FIRMWARE_DEFAULT;
   2010         }
   2011         break;
   2012     case SOC_PHY_CONTROL_FIRMWARE_RX_FORCE_EXTENDED_REACH_ENABLE:
   2013         *value = fw_config.ForceExtenedReach ? 1 : 0;
   2014         break;
   2015     case SOC_PHY_CONTROL_FIRMWARE_RX_FORCE_NORMAL_REACH_ENABLE:
   2016         *value = fw_config.ForceNormalReach ? 1 : 0;
   2017         break;
   2018     }
   2019                     
   2020 
   2021     return SOC_E_NONE;
   2022 
   2023 }
   2024 STATIC int
   2025 control_handler_rx_seq_done_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   2026 {
   2027 
   2028     SOC_IF_ERROR_RETURN(phymod_phy_rx_pmd_locked_get(phy, value));
   2029 
   2030     return SOC_E_NONE;
   2031 }
   2032 
   2033 STATIC int 
   2034 control_handler_tx_polarity_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   2035 {
   2036     phymod_polarity_t    polarity;
   2037 
   2038     SOC_IF_ERROR_RETURN(phymod_phy_polarity_get(phy, &polarity));
   2039     *value = polarity.tx_polarity;
   2040 
   2041     return SOC_E_NONE;
   2042 }
   2043 
   2044 
   2045 STATIC int 
   2046 control_handler_rx_polarity_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   2047 {
   2048     phymod_polarity_t    polarity;
   2049 
   2050     SOC_IF_ERROR_RETURN(phymod_phy_polarity_get(phy, &polarity));
   2051     *value = polarity.rx_polarity;
   2052 
   2053     return SOC_E_NONE;
   2054 }
   2055 
   2056 
   2057 STATIC int
   2058 control_handler_rx_reset_get(int unit, phymod_phy_access_t *phy,  uint32 param, uint32 *value)
   2059 {
   2060     phymod_phy_reset_t reset;
   2061 
   2062     SOC_IF_ERROR_RETURN(phymod_phy_reset_get(phy, &reset));
   2063     *value = (reset.rx  == phymodResetDirectionIn) ?  1 : 0;
   2064 
   2065     return SOC_E_NONE;
   2066 }
   2067 
   2068 
   2069 STATIC int
   2070 control_handler_tx_reset_get(int unit, phymod_phy_access_t *phy,  uint32 param, uint32 *value)
   2071 {
   2072     phymod_phy_reset_t reset;
   2073 
   2074     SOC_IF_ERROR_RETURN(phymod_phy_reset_get(phy, &reset));
   2075     *value = (reset.tx  == phymodResetDirectionIn) ?  1 : 0;
   2076 
   2077     return SOC_E_NONE;
   2078 }
   2079 
   2080 STATIC int
   2081 control_handler_interface_set (int unit, phymod_phy_access_t *phy,  uint32 intf_type, uint32 param2)
   2082 {
   2083     phymod_phy_inf_config_t config;
   2084 
   2085     SOC_IF_ERROR_RETURN(phymod_phy_interface_config_get(phy, 0 /* flags */, param2, &config));
   2086     SOC_IF_ERROR_RETURN(soc_phymod_phy_intf_from_port_intf(unit,
   2087                     config.data_rate, intf_type, &(config.interface_type)));
   2088     SOC_IF_ERROR_RETURN(phymod_phy_interface_config_set(phy, 0, &config));
   2089 
   2090     return SOC_E_NONE;
   2091 }
   2092 
   2093 STATIC int
   2094 control_handler_interface_get (int unit, phymod_phy_access_t *phy, uint32_t param2,  uint32_t *intf_type )
   2095 {
   2096     phymod_phy_inf_config_t config;
   2097 
   2098     SOC_IF_ERROR_RETURN(phymod_phy_interface_config_get(phy, 0 /* flags */, param2, &config));
   2099     SOC_IF_ERROR_RETURN(soc_phymod_phy_intf_to_port_intf(unit, config.interface_type, intf_type));
   2100 
   2101     return SOC_E_NONE;
   2102 }
   2103 
   2104 STATIC int
   2105 control_handler_gpio_config_set(int unit, phymod_phy_access_t *phy,  uint32 value, uint32 param2) {
   2106     int gpio_pin_no = 0 ;
   2107     phymod_gpio_mode_t gpio_mode= (value >= phymodGpioModeCount)? phymodGpioModeDisabled : value;
   2108 
   2109     for (gpio_pin_no = 0; gpio_pin_no < 4; gpio_pin_no++) {
   2110         gpio_mode = (value >> (4 * gpio_pin_no)) & 0xF;
   2111         SOC_IF_ERROR_RETURN(phymod_phy_gpio_config_set(phy, gpio_pin_no, gpio_mode));
   2112     }
   2113 
   2114     return SOC_E_NONE;
   2115 }
   2116 
   2117 STATIC int
   2118 control_handler_gpio_config_get(int unit, phymod_phy_access_t *phy,  uint32 param2, uint32 *value) {
   2119     int gpio_pin_no = 0 ;
   2120     phymod_gpio_mode_t gpio_mode= phymodGpioModeDisabled;
   2121 
   2122 
   2123     for (gpio_pin_no = 0; gpio_pin_no < 4; gpio_pin_no++) {
   2124         SOC_IF_ERROR_RETURN(phymod_phy_gpio_config_get(phy, gpio_pin_no, &gpio_mode));
   2125         *value |= (gpio_mode << (4 * gpio_pin_no));
   2126     }
   2127 
   2128     return SOC_E_NONE;
   2129 }
   2130 
   2131 STATIC int
   2132 control_handler_gpio_pin_value_set(int unit, phymod_phy_access_t *phy,  uint32 value, uint32 param2) {
   2133     int gpio_pin_no = 0 ;
   2134     int gpio_pin_value = 0 ;
   2135 
   2136     for (gpio_pin_no = 0; gpio_pin_no < 4; gpio_pin_no++) {
   2137         gpio_pin_value = (value >> (4 * gpio_pin_no)) & 0xF;
   2138         SOC_IF_ERROR_RETURN(phymod_phy_gpio_pin_value_set(phy, gpio_pin_no, gpio_pin_value));
   2139     }
   2140 
   2141     return SOC_E_NONE;
   2142 }
   2143 
   2144 STATIC int
   2145 control_handler_gpio_pin_value_get(int unit, phymod_phy_access_t *phy,  uint32 param2, uint32 *value) {
   2146     int gpio_pin_no = 0 ;
   2147     int gpio_pin_value = 0 ;
   2148 
   2149 
   2150     for (gpio_pin_no = 0; gpio_pin_no < 4; gpio_pin_no++) {
   2151         SOC_IF_ERROR_RETURN(phymod_phy_gpio_pin_value_get(phy, gpio_pin_no, &gpio_pin_value));
   2152         *value |= (gpio_pin_value << (4 * gpio_pin_no));
   2153     }
   2154 
   2155     return SOC_E_NONE;
   2156 }
   2157 
   2158 STATIC int
   2159 control_handler_intr_status_get(int unit, phymod_phy_access_t *phy,  uint32 param2, uint32 *value) {
   2160 
   2161     *value = 0;
   2162     SOC_IF_ERROR_RETURN(phymod_phy_intr_status_get(phy, value));
   2163 
   2164     return(phymod_phy_intr_status_clear(phy, *value));
   2165 }
   2166 
   2167 STATIC int
   2168 control_handler_linkdown_transmit_set(int unit, phymod_phy_access_t *phy,  uint32 value, uint32 param2) {
   2169 
   2170     return SOC_E_NONE;
   2171 }
   2172 
   2173 STATIC int
   2174 control_handler_linkdown_transmit_get(int unit, phymod_phy_access_t *phy,  uint32 param2, uint32 *value) {
   2175 
   2176     return SOC_E_NONE;
   2177 }
   2178 
   2179 STATIC int
   2180 control_handler_intr_enable_set(int unit, phymod_phy_access_t *phy,  uint32 value, uint32 param2) {
   2181 
   2182     return(phymod_phy_intr_enable_set(phy, value));
   2183 }
   2184 
   2185 STATIC int
   2186 control_handler_intr_enable_get(int unit, phymod_phy_access_t *phy,  uint32 param2, uint32 *value) {
   2187 
   2188     return(phymod_phy_intr_enable_get(phy, value));
   2189 }
   2190 
   2191 STATIC int
   2192 control_handler_unreliable_los_enable_set(int unit, phymod_phy_access_t *phy,  uint32 value, uint32 param2) {
   2193 
   2194     phymod_firmware_lane_config_t config;
   2195     SOC_IF_ERROR_RETURN(phymod_phy_firmware_lane_config_get(phy, &config));
   2196     config.UnreliableLos = value;
   2197     SOC_IF_ERROR_RETURN(phymod_phy_firmware_lane_config_set(phy, config));
   2198 
   2199     return SOC_E_NONE;
   2200 }
   2201 
   2202 STATIC int
   2203 control_handler_unreliable_los_enable_get(int unit, phymod_phy_access_t *phy,  uint32 param2, uint32 *value) {
   2204 
   2205     phymod_firmware_lane_config_t config;
   2206     SOC_IF_ERROR_RETURN(phymod_phy_firmware_lane_config_get(phy, &config));
   2207     *value = config.UnreliableLos;
   2208 
   2209     return SOC_E_NONE;
   2210 }
   2211 
   2212 STATIC int
   2213 control_handler_eye_margin_hz_l_get(int unit, phymod_phy_access_t *phy,  uint32 param2, uint32 *value) {
   2214 
   2215     SOC_IF_ERROR_RETURN(phymod_phy_eye_margin_est_get(phy, phymod_eye_marign_HZ_L, value));
   2216 
   2217     return SOC_E_NONE;
   2218 }
   2219 
   2220 STATIC int
   2221 control_handler_eye_margin_hz_r_get(int unit, phymod_phy_access_t *phy,  uint32 param2, uint32 *value) {
   2222 
   2223     SOC_IF_ERROR_RETURN(phymod_phy_eye_margin_est_get(phy, phymod_eye_marign_HZ_R, value));
   2224 
   2225     return SOC_E_NONE;
   2226 }
   2227 
   2228 STATIC int
   2229 control_handler_eye_margin_vt_u_get(int unit, phymod_phy_access_t *phy,  uint32 param2, uint32 *value) {
   2230 
   2231     SOC_IF_ERROR_RETURN(phymod_phy_eye_margin_est_get(phy, phymod_eye_marign_VT_U, value));
   2232 
   2233     return SOC_E_NONE;
   2234 }
   2235 
   2236 STATIC int
   2237 control_handler_eye_margin_vt_d_get(int unit, phymod_phy_access_t *phy,  uint32 param2, uint32 *value) {
   2238 
   2239     SOC_IF_ERROR_RETURN(phymod_phy_eye_margin_est_get(phy, phymod_eye_marign_VT_D, value));
   2240 
   2241     return SOC_E_NONE;
   2242 }
   2243 
   2244 STATIC int
   2245 control_handler_autoneg_get (int unit, phymod_phy_access_t *phy, uint32_t param2,  uint32_t *value )
   2246 {
   2247     phymod_autoneg_control_t an;
   2248     int an_done;
   2249     SOC_IF_ERROR_RETURN(phymod_phy_autoneg_get(phy, &an, (uint32 *)&an_done));
   2250     switch(an.an_mode) {
   2251         case phymod_AN_MODE_CL37:
   2252             *value= SOC_PHY_CONTROL_AUTONEG_MODE_CL37;
   2253             break;
   2254         case phymod_AN_MODE_CL37BAM:
   2255             *value = SOC_PHY_CONTROL_AUTONEG_MODE_CL37_BAM;
   2256             break;
   2257         case phymod_AN_MODE_CL73:
   2258             *value = SOC_PHY_CONTROL_AUTONEG_MODE_CL73;
   2259             break;
   2260         case phymod_AN_MODE_CL73BAM:
   2261             *value = SOC_PHY_CONTROL_AUTONEG_MODE_CL73_BAM;
   2262             break;
   2263         default:
   2264             return SOC_E_PARAM;
   2265             break;
   2266     }
   2267     return SOC_E_NONE;
   2268 }
   2269 
   2270 STATIC int
   2271 control_handler_pm_codec_enable_set(int unit,
   2272                                    phymod_phy_access_t *phy,
   2273                                    uint32_t value,
   2274                                    uint32_t param2)
   2275 {
   2276     phymod_phy_hg2_codec_t codec_mode;
   2277 
   2278     if (phy == NULL) return SOC_E_INTERNAL;
   2279 
   2280     switch (value) {
   2281         case SOC_PHY_CONTROL_HG2_BCM_CODEC_ENABLE_OFF:
   2282             codec_mode = phymodBcmHG2CodecOff;
   2283             break;
   2284         case SOC_PHY_CONTROL_HG2_BCM_CODEC_ENABLE_ON_WITH_8BYTE_IPG:
   2285             codec_mode = phymodBcmHG2CodecOnWith8ByteIPG;
   2286             break;
   2287         case SOC_PHY_CONTROL_HG2_BCM_CODEC_ENABLE_ON_WITH_9BYTE_IPG:
   2288             codec_mode = phymodBcmHG2CodecOnWith9ByteIPG;
   2289             break;
   2290         default:
   2291             codec_mode = phymodBcmHG2CodecOff;
   2292             break;
   2293     }
   2294 
   2295     return (phymod_phy_hg2_codec_control_set(phy, codec_mode));
   2296 }
   2297 
   2298 STATIC int
   2299 control_handler_pm_codec_enable_get(int unit,
   2300                                    phymod_phy_access_t *phy,
   2301                                    uint32_t param2,
   2302                                    uint32_t *value)
   2303 {
   2304     phymod_phy_hg2_codec_t codec_mode;
   2305 
   2306     if (phy == NULL) return SOC_E_INTERNAL;
   2307 
   2308     SOC_IF_ERROR_RETURN(phymod_phy_hg2_codec_control_get(phy, &codec_mode));
   2309 
   2310     switch (codec_mode) {
   2311         case phymodBcmHG2CodecOff:
   2312             *value = SOC_PHY_CONTROL_HG2_BCM_CODEC_ENABLE_OFF;
   2313             break;
   2314         case phymodBcmHG2CodecOnWith8ByteIPG:
   2315             *value = SOC_PHY_CONTROL_HG2_BCM_CODEC_ENABLE_ON_WITH_8BYTE_IPG;
   2316             break;
   2317         case phymodBcmHG2CodecOnWith9ByteIPG:
   2318             *value = SOC_PHY_CONTROL_HG2_BCM_CODEC_ENABLE_ON_WITH_9BYTE_IPG;
   2319             break;
   2320         default:
   2321             *value = SOC_PHY_CONTROL_HG2_BCM_CODEC_ENABLE_OFF;
   2322             break;
   2323 
   2324     }
   2325     return SOC_E_NONE;
   2326 }
   2327 
   2328 STATIC int
   2329 control_handler_eee_set(int unit, phymod_phy_access_t *phy,  uint32 value, uint32 param2) {
   2330     SOC_IF_ERROR_RETURN(phymod_phy_eee_set(phy, value));
   2331     return SOC_E_NONE;
   2332 }
   2333 
   2334 STATIC int
   2335 control_handler_eee_get (int unit, phymod_phy_access_t *phy, uint32_t param2,  uint32_t *value )
   2336 {
   2337     SOC_IF_ERROR_RETURN(phymod_phy_eee_get(phy, value));
   2338     return SOC_E_NONE;
   2339 }
   2340 
   2341 STATIC int
   2342 control_handler_pam4_tx_pattern_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   2343 {
   2344     uint32_t linear_enable = 0;
   2345     uint32_t jp03b_enable = 0;
   2346 
   2347     SOC_IF_ERROR_RETURN(phymod_phy_PAM4_tx_pattern_enable_get(phy, phymod_PAM4TxPattern_JP03B, &jp03b_enable));
   2348     SOC_IF_ERROR_RETURN(phymod_phy_PAM4_tx_pattern_enable_get(phy, phymod_PAM4TxPattern_Linear, &linear_enable));
   2349     if (jp03b_enable) {
   2350         *value = SOC_PHY_PAM4_TX_PATTERN_JP03B;
   2351     } else if (linear_enable) {
   2352         *value = SOC_PHY_PAM4_TX_PATTERN_LINEAR;
   2353     } else {
   2354         *value = SOC_PHY_PAM4_TX_PATTERN_OFF;
   2355     }
   2356     return SOC_E_NONE;
   2357 }
   2358 
   2359 STATIC int
   2360 control_handler_pcs_mode_get (int unit, phymod_phy_access_t *phy, uint32 param2, uint32 *value)
   2361 {
   2362     phymod_phy_inf_config_t config;
   2363 
   2364     SOC_IF_ERROR_RETURN(phymod_phy_interface_config_get(phy, 0 /* flags */, param2, &config));
   2365 
   2366     if (phy->type == phymodDispatchTypeTsce) {
   2367         if (PHYMOD_INTF_MODES_HIGIG_GET(&config)) {
   2368             if (config.interface_type == phymodInterfaceXGMII) {
   2369                 *value = SOC_PHY_CONTROL_PCS_MODE_BRCM;
   2370             } else {
   2371                 *value = SOC_PHY_CONTROL_PCS_MODE_IEEE;
   2372             }
   2373             return SOC_E_NONE;
   2374         }
   2375     }
   2376 
   2377     *value = SOC_PHY_CONTROL_PCS_MODE_IEEE;
   2378     return SOC_E_NONE;
   2379 }
   2380 
   2381 STATIC int
   2382 control_handler_fec_counter_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   2383 {
   2384     if (param) {
   2385         SOC_IF_ERROR_RETURN(phymod_phy_fec_uncorrectable_counter_get(phy, value));
   2386     } else {
   2387         SOC_IF_ERROR_RETURN(phymod_phy_fec_correctable_counter_get(phy, value));
   2388     }
   2389     return SOC_E_NONE;
   2390 }
   2391 
   2392 STATIC int
   2393 control_handler_fec_cl91_counter_get(int unit, phymod_phy_access_t *phy, uint32 param, uint32 *value)
   2394 {
   2395     if (param) {
   2396         SOC_IF_ERROR_RETURN(phymod_phy_fec_cl91_uncorrectable_counter_get(phy, value));
   2397     } else {
   2398         SOC_IF_ERROR_RETURN(phymod_phy_fec_cl91_correctable_counter_get(phy, value));
   2399     }
   2400     return SOC_E_NONE;
   2401 }
   2402 
   2403 STATIC int
   2404 control_handler_fec_bypass_indication_set(int unit, phymod_phy_access_t *phy,  uint32_t value, uint32_t param2) {
   2405     SOC_IF_ERROR_RETURN(phymod_phy_fec_bypass_indication_set(phy, value));
   2406     return SOC_E_NONE;
   2407 }
   2408 
   2409 STATIC int
   2410 control_handler_fec_bypass_indication_get (int unit, phymod_phy_access_t *phy, uint32_t param2,  uint32_t *value )
   2411 {
   2412     SOC_IF_ERROR_RETURN(phymod_phy_fec_bypass_indication_get(phy, value));
   2413     return SOC_E_NONE;
   2414 }
   2415 
   2416 STATIC int
   2417 control_handler_pdet_set(int unit, phymod_phy_access_t *phy,  uint32 value, uint32 param2)
   2418 {
   2419     phymod_autoneg_control_t an_config;
   2420     uint32      an_done;
   2421     int           rv = SOC_E_NONE, num_lane = 0;
   2422     uint32_t lane_mask;
   2423     int control = param2;
   2424 
   2425     sal_memset(&an_config, 0, sizeof(phymod_autoneg_control_t));
   2426 
   2427     SOC_IF_ERROR_RETURN(phymod_phy_autoneg_get(phy, &an_config, &an_done));
   2428     lane_mask = phy->access.lane_mask;
   2429     while (lane_mask) {
   2430         if (lane_mask & 0x1) num_lane++;
   2431         lane_mask >>= 1;
   2432     }
   2433     an_config.num_lane_adv = num_lane;
   2434 
   2435     switch (control) {
   2436         case SOC_PHY_CONTROL_PARALLEL_DETECTION:
   2437             if (value) {
   2438                 PHYMOD_AN_F_SET_CL73_PDET_KX_ENABLE_SET(&an_config);
   2439             } else {
   2440                 PHYMOD_AN_F_SET_CL73_PDET_KX_ENABLE_CLR(&an_config);
   2441             }
   2442             break;
   2443         case SOC_PHY_CONTROL_PARALLEL_DETECTION_10G:
   2444             if (value) {
   2445                 PHYMOD_AN_F_SET_CL73_PDET_KX4_ENABLE_SET(&an_config);
   2446             } else {
   2447                 PHYMOD_AN_F_SET_CL73_PDET_KX4_ENABLE_CLR(&an_config);
   2448             }
   2449             break;
   2450     }
   2451 
   2452     rv = phymod_phy_autoneg_set(phy, &an_config);
   2453     /* Because the returned value PHYMOD_E_UNAVAIL is -12 from tscf phymod driver */
   2454     if (rv == PHYMOD_E_UNAVAIL) {
   2455         rv = SOC_E_UNAVAIL;
   2456     }
   2457 
   2458     return rv;
   2459 
   2460 }
   2461 
   2462 STATIC int
   2463 control_handler_pdet_get (int unit, phymod_phy_access_t *phy, uint32_t param,  uint32_t *value )
   2464 {
   2465     phymod_autoneg_control_t an_config;
   2466     uint32      an_done;
   2467     int control = param;
   2468 
   2469     sal_memset(&an_config, 0, sizeof(phymod_autoneg_control_t));
   2470 
   2471     SOC_IF_ERROR_RETURN(phymod_phy_autoneg_get(phy, &an_config, &an_done));
   2472     switch (control) {
   2473         case SOC_PHY_CONTROL_PARALLEL_DETECTION:
   2474             if (PHYMOD_AN_F_SET_CL73_PDET_KX_ENABLE_GET(&an_config)) {
   2475                 *value = 1;
   2476             } else {
   2477                 *value = 0;
   2478             }
   2479             break;
   2480         case SOC_PHY_CONTROL_PARALLEL_DETECTION_10G:
   2481             if (PHYMOD_AN_F_SET_CL73_PDET_KX4_ENABLE_GET(&an_config)) {
   2482                 *value = 1;
   2483             } else {
   2484                 *value = 0;
   2485             }
   2486             break;
   2487     }
   2488 
   2489     return SOC_E_NONE;
   2490 }
   2491 
   2492 STATIC int
   2493 control_handler_tx_pam4_precoder_enable_get(int unit, phymod_phy_access_t *phy,  uint32 param,  uint32 *value)
   2494 {
   2495     int temp_value; 
   2496     SOC_IF_ERROR_RETURN(phymod_phy_tx_pam4_precoder_enable_get(phy,&temp_value));
   2497     *value = (uint32_t) temp_value;
   2498     return SOC_E_NONE;
   2499 }
   2500 
   2501 STATIC int
   2502 control_handler_lp_tx_precoder_enable_get(int unit, phymod_phy_access_t *phy,  uint32 param,  uint32 *value)
   2503 {
   2504     phymod_firmware_lane_config_t fw_config;
   2505 
   2506     SOC_IF_ERROR_RETURN(phymod_phy_firmware_lane_config_get(phy, &fw_config));
   2507     *value = fw_config.LpPrecoderEnabled;
   2508     return SOC_E_NONE;
   2509 }
   2510 
   2511 STATIC int
   2512 control_handler_rx_ppm_get(int unit, phymod_phy_access_t *phy, uint32_t param2, uint32_t *value)
   2513 {
   2514     int rv = SOC_E_NONE;
   2515     int16 rx_ppm = 0;
   2516 
   2517     rv = phymod_phy_rx_ppm_get(phy, &rx_ppm);
   2518     /* Because the returned value PHYMOD_E_UNAVAIL is -12 from viper phymod driver */
   2519     if (rv == PHYMOD_E_UNAVAIL) {
   2520         rv = SOC_E_UNAVAIL;
   2521     } else {
   2522         *value = (uint32_t)rx_ppm;
   2523     }
   2524 
   2525     return rv;
   2526 }
   2527 
   2528 STATIC int
   2529 control_handler_fast_ber_proj_get(int unit, phymod_phy_access_t *phy,  uint32 param2, uint32 *value)
   2530 {
   2531 
   2532     SOC_IF_ERROR_RETURN(phymod_phy_fast_ber_proj_get(phy, value));
   2533 
   2534     return SOC_E_NONE;
   2535 }
   2536 
   2537 
   2538 STATIC int
   2539 control_handler_channel_loss_hint_get(int unit, phymod_phy_access_t *phy,  uint32 param2, uint32 *value)
   2540 {
   2541 
   2542     SOC_IF_ERROR_RETURN(phymod_phy_channel_loss_hint_get(phy, value));
   2543 
   2544     return SOC_E_NONE;
   2545 }
   2546 
   2547 
   2548 
   2549 /****************************************************************************** 
   2550   port and phy control set wrapers
   2551  */
   2552 
   2553 
   2554 /* when calling this function,  make sure pack enough array of phymod_phy_access_t if nof_phys != 1, and phys points to the first object */
   2555 /* assume the phymod_phy_access object is just a working copy, no need to make a copy again or reset the object content */
   2556 int soc_port_control_get_wrapper(int unit, phymod_ref_clk_t ref_clock, int is_lane_control, phymod_phy_access_t *phys, int nof_phys, soc_phy_control_t control, uint32 *value)
   2557 {
   2558     control_get_handler_f handler = NULL;
   2559     uint32 param = 0;
   2560     int i;
   2561     int lane_control_support = FALSE;
   2562 
   2563     if ((control < 0) || (control >= SOC_PHY_CONTROL_COUNT)) {
   2564         return (SOC_E_PARAM);
   2565     }
   2566 
   2567     *value = 0;
   2568     switch(control) {
   2569     case SOC_PHY_CONTROL_TX_FIR_MODE:
   2570         handler = control_handler_tx_fir_mode_get;
   2571         lane_control_support = TRUE;
   2572         break;
   2573     case SOC_PHY_CONTROL_TX_FIR_PRE2:
   2574         handler = control_handler_tx_fir_pre2_get;
   2575         lane_control_support = TRUE;
   2576         break;
   2577     case SOC_PHY_CONTROL_TX_FIR_PRE:
   2578         handler = control_handler_tx_fir_pre_get;
   2579         lane_control_support = TRUE;
   2580         break;
   2581     case SOC_PHY_CONTROL_TX_FIR_MAIN:
   2582         handler = control_handler_tx_fir_main_get;
   2583         lane_control_support = TRUE;
   2584         break;
   2585     case SOC_PHY_CONTROL_TX_FIR_POST:
   2586         handler = control_handler_tx_fir_post_get;
   2587         lane_control_support = TRUE;
   2588         break;
   2589     case SOC_PHY_CONTROL_TX_FIR_POST2:
   2590         handler = control_handler_tx_fir_post2_get;
   2591         lane_control_support = TRUE;
   2592         break;
   2593     case SOC_PHY_CONTROL_TX_FIR_POST3:
   2594         handler = control_handler_tx_fir_post3_get;
   2595         lane_control_support = TRUE;
   2596         break;
   2597     /* PREEMPHASIS */
   2598     case SOC_PHY_CONTROL_PREEMPHASIS:
   2599         handler = control_handler_preemphasis_get;
   2600         lane_control_support = TRUE;
   2601         break;
   2602     case SOC_PHY_CONTROL_PREEMPHASIS_LANE0:
   2603         phys->access.lane_mask = 0x1 ;
   2604         handler = control_handler_preemphasis_get;
   2605         lane_control_support = TRUE;
   2606         break;
   2607     case SOC_PHY_CONTROL_PREEMPHASIS_LANE1:
   2608         phys->access.lane_mask = 0x2 ;
   2609         handler = control_handler_preemphasis_get;
   2610         lane_control_support = TRUE;
   2611         break;
   2612     case SOC_PHY_CONTROL_PREEMPHASIS_LANE2:
   2613         phys->access.lane_mask = 0x4 ;
   2614         handler = control_handler_preemphasis_get;
   2615         lane_control_support = TRUE;
   2616         break;
   2617     case SOC_PHY_CONTROL_PREEMPHASIS_LANE3:
   2618         phys->access.lane_mask = 0x8 ;
   2619         handler = control_handler_preemphasis_get;
   2620         lane_control_support = TRUE;
   2621         break;
   2622     /* DRIVER CURRENT */
   2623     case SOC_PHY_CONTROL_DRIVER_CURRENT_LANE0:
   2624         phys->access.lane_mask = 0x1 ;
   2625         handler = control_handler_driver_current_get;
   2626         lane_control_support = TRUE;
   2627         break;
   2628     case SOC_PHY_CONTROL_DRIVER_CURRENT_LANE1:
   2629         phys->access.lane_mask = 0x2 ;
   2630         handler = control_handler_driver_current_get;
   2631         lane_control_support = TRUE;
   2632         break;
   2633     case SOC_PHY_CONTROL_DRIVER_CURRENT_LANE2:
   2634         phys->access.lane_mask = 0x4 ;
   2635         handler = control_handler_driver_current_get;
   2636         lane_control_support = TRUE;
   2637         break;
   2638     case SOC_PHY_CONTROL_DRIVER_CURRENT_LANE3:
   2639         phys->access.lane_mask = 0x8 ;
   2640         handler = control_handler_driver_current_get;
   2641         lane_control_support = TRUE;
   2642         break;
   2643     case SOC_PHY_CONTROL_DRIVER_CURRENT:
   2644         handler = control_handler_driver_current_get;
   2645         lane_control_support = TRUE;
   2646         break;
   2647     case SOC_PHY_CONTROL_TX_FIR_DRIVERMODE:
   2648         handler = control_handler_tx_fir_drivermode_get;
   2649         lane_control_support = TRUE;
   2650         break;
   2651      /* TX LANE SQUELCH */
   2652     case SOC_PHY_CONTROL_TX_LANE_SQUELCH:
   2653         handler = control_handler_tx_squelch_get;
   2654         lane_control_support = TRUE;
   2655         break;
   2656      /* RX LANE SQUELCH */
   2657     case SOC_PHY_CONTROL_RX_LANE_SQUELCH:
   2658         handler = control_handler_rx_squelch_get;
   2659         lane_control_support = TRUE;
   2660         break;
   2661     /* RX PEAK FILTER */
   2662     case SOC_PHY_CONTROL_RX_PEAK_FILTER:
   2663         handler = control_handler_rx_peak_filter_get;
   2664         lane_control_support = TRUE;
   2665         break;
   2666     /* RX VGA */
   2667     case SOC_PHY_CONTROL_RX_VGA:
   2668         handler = control_handler_rx_vga_get;
   2669         lane_control_support = TRUE;
   2670         break;
   2671     /* RX TAP */
   2672     case SOC_PHY_CONTROL_RX_TAP1:
   2673         handler = control_handler_rx_tap_get;
   2674         lane_control_support = TRUE;
   2675         break;
   2676     case SOC_PHY_CONTROL_RX_TAP2:
   2677         handler = control_handler_rx_tap_get;
   2678         lane_control_support = TRUE;
   2679         param = 1;
   2680         break;
   2681     case SOC_PHY_CONTROL_RX_TAP3:
   2682         handler = control_handler_rx_tap_get;
   2683         lane_control_support = TRUE;
   2684         param = 2;
   2685         break;
   2686     case SOC_PHY_CONTROL_RX_TAP4:
   2687         handler = control_handler_rx_tap_get;
   2688         lane_control_support = TRUE;
   2689         param = 3;
   2690         break;
   2691     case SOC_PHY_CONTROL_RX_TAP5:
   2692         handler = control_handler_rx_tap_get;
   2693         lane_control_support = TRUE;
   2694         param = 4;
   2695         break;
   2696     case SOC_PHY_CONTROL_RX_TAP6:
   2697         handler = control_handler_rx_tap_get;
   2698         lane_control_support = TRUE;
   2699         param = 5;
   2700         break;
   2701     /* PHASE INTERPOLATOR */
   2702     case SOC_PHY_CONTROL_PHASE_INTERP:
   2703     case SOC_PHY_CONTROL_TX_PPM_ADJUST:
   2704         handler = control_handler_pi_control_get;
   2705         lane_control_support = TRUE;
   2706         break;
   2707 
   2708     /* RX_SIGNAL_DETECT  */
   2709     case SOC_PHY_CONTROL_RX_SIGNAL_DETECT :
   2710         handler = control_handler_rx_signal_detect_get;
   2711         lane_control_support = TRUE;
   2712         break;
   2713 
   2714     /* CL72 ENABLE */
   2715     case SOC_PHY_CONTROL_CL72:
   2716         handler = control_handler_cl72_enable_get;
   2717         lane_control_support = TRUE;
   2718         break;
   2719 
   2720     /* SHORT_CHANNEL_MODE ENABLE */
   2721     case SOC_PHY_CONTROL_SHORT_CHANNEL_MODE:
   2722         handler = control_handler_short_chn_mode_enable_get;
   2723         lane_control_support = TRUE;
   2724         break;
   2725 
   2726     /* SHORT_CHANNEL_MODE ENABLE STATUS*/
   2727     case SOC_PHY_CONTROL_SHORT_CHANNEL_MODE_STATUS:
   2728         handler = control_handler_short_chn_mode_status_get;
   2729         lane_control_support = TRUE;
   2730         break;
   2731 
   2732     /* CL72 STATUS */
   2733     case SOC_PHY_CONTROL_CL72_STATUS:
   2734         handler = control_handler_cl72_status_get;
   2735         lane_control_support = TRUE;
   2736         break;
   2737 
   2738     /* LANE SWAP */
   2739     case SOC_PHY_CONTROL_LANE_SWAP:
   2740         handler = control_handler_lane_map_get;
   2741         break;
   2742     /* TX PATTERN */
   2743     case SOC_PHY_CONTROL_TX_PATTERN_LENGTH:
   2744         handler = control_handler_pattern_length_get;
   2745         lane_control_support = TRUE;
   2746         break ;
   2747     case SOC_PHY_CONTROL_TX_PATTERN_GEN_ENABLE:
   2748         handler = control_handler_pattern_enable_get;
   2749         lane_control_support = TRUE;
   2750         break ;
   2751     case SOC_PHY_CONTROL_TX_PATTERN_DATA0:
   2752         handler = control_handler_pattern_config_get;
   2753         lane_control_support = TRUE;
   2754         param = 0;
   2755         break;
   2756     case SOC_PHY_CONTROL_TX_PATTERN_DATA1:
   2757         handler = control_handler_pattern_config_get;
   2758         lane_control_support = TRUE;
   2759         param = 1;
   2760         break;
   2761     case SOC_PHY_CONTROL_TX_PATTERN_DATA2:
   2762         handler = control_handler_pattern_config_get;
   2763         lane_control_support = TRUE;
   2764         param = 2;
   2765         break;
   2766     case SOC_PHY_CONTROL_TX_PATTERN_DATA3:
   2767         handler = control_handler_pattern_config_get;
   2768         lane_control_support = TRUE;
   2769         param = 3;
   2770         break;
   2771     case SOC_PHY_CONTROL_TX_PATTERN_DATA4:
   2772         handler = control_handler_pattern_config_get;
   2773         lane_control_support = TRUE;
   2774         param = 4;
   2775         break;
   2776     case SOC_PHY_CONTROL_TX_PATTERN_DATA5:
   2777         handler = control_handler_pattern_config_get;
   2778         lane_control_support = TRUE;
   2779         param = 5;
   2780         break;
   2781     case SOC_PHY_CONTROL_TX_PATTERN_DATA6:
   2782         handler = control_handler_pattern_config_get;
   2783         lane_control_support = TRUE;
   2784         param = 6;
   2785         break;
   2786     case SOC_PHY_CONTROL_TX_PATTERN_DATA7:
   2787         handler = control_handler_pattern_config_get;
   2788         lane_control_support = TRUE;
   2789         param = 7;
   2790         break;
   2791     /* PRBS */
   2792     case SOC_PHY_CONTROL_PRBS_POLYNOMIAL:
   2793         handler = control_handler_prbs_poly_get;
   2794         lane_control_support = TRUE;
   2795         break;
   2796     case SOC_PHY_CONTROL_PRBS_TX_INVERT_DATA:
   2797         handler = control_handler_prbs_tx_invert_data_get;
   2798         lane_control_support = TRUE;
   2799         break;
   2800     case SOC_PHY_CONTROL_PRBS_TX_ENABLE:
   2801         handler = control_handler_prbs_tx_enable_get;
   2802         lane_control_support = TRUE;
   2803         break;
   2804     case SOC_PHY_CONTROL_PRBS_RX_INVERT_DATA:
   2805         handler = control_handler_prbs_rx_invert_data_get;
   2806         lane_control_support = TRUE;
   2807         break;
   2808     case SOC_PHY_CONTROL_PRBS_RX_ENABLE:
   2809         handler = control_handler_prbs_rx_enable_get;
   2810         lane_control_support = TRUE;
   2811         break;
   2812     case SOC_PHY_CONTROL_PRBS_DECOUPLED_TX_POLYNOMIAL:
   2813         handler = control_handler_prbs_tx_poly_get;
   2814         lane_control_support = TRUE;
   2815         break;
   2816     case SOC_PHY_CONTROL_PRBS_DECOUPLED_TX_INVERT_DATA:
   2817         handler = control_handler_prbs_tx_invert_data_get;
   2818         lane_control_support = TRUE;
   2819         break;
   2820     case SOC_PHY_CONTROL_PRBS_DECOUPLED_TX_ENABLE:
   2821         handler = control_handler_prbs_tx_enable_get;
   2822         lane_control_support = TRUE;
   2823         break; 
   2824     case SOC_PHY_CONTROL_PRBS_DECOUPLED_RX_POLYNOMIAL:
   2825         handler = control_handler_prbs_rx_poly_get;
   2826         lane_control_support = TRUE;
   2827         break;
   2828     case SOC_PHY_CONTROL_PRBS_DECOUPLED_RX_INVERT_DATA:
   2829         handler = control_handler_prbs_rx_invert_data_get;
   2830         lane_control_support = TRUE;
   2831         break;
   2832     case SOC_PHY_CONTROL_PRBS_DECOUPLED_RX_ENABLE:
   2833         handler = control_handler_prbs_rx_enable_get;
   2834         lane_control_support = TRUE;
   2835         break; 
   2836     case SOC_PHY_CONTROL_PRBS_RX_STATUS:
   2837         handler = control_handler_prbs_rx_status_get;
   2838         lane_control_support = TRUE;
   2839         break;
   2840     /* LOOPBACK */
   2841     case SOC_PHY_CONTROL_LOOPBACK_INTERNAL:
   2842         handler = control_handler_loopback_internal_get;
   2843         lane_control_support = TRUE;
   2844        break;
   2845     case SOC_PHY_CONTROL_LOOPBACK_PMD:
   2846         handler = control_handler_loopback_pmd_get;
   2847         lane_control_support = TRUE;
   2848        break;
   2849 
   2850     case SOC_PHY_CONTROL_LOOPBACK_REMOTE_PCS_BYPASS:
   2851         handler = control_handler_loopback_remote_get;
   2852         lane_control_support = TRUE;
   2853         break;
   2854 
   2855     /* SCRAMBLER */
   2856     case SOC_PHY_CONTROL_SCRAMBLER:
   2857         handler = control_handler_scrambler_get;
   2858         param = ref_clock;
   2859         break;
   2860     case SOC_PHY_CONTROL_FORWARD_ERROR_CORRECTION:
   2861         handler = control_handler_fec_get;
   2862         param = ref_clock;
   2863         lane_control_support = TRUE;
   2864         break;
   2865     case SOC_PHY_CONTROL_FORWARD_ERROR_CORRECTION_CL91:
   2866         handler = control_handler_fec_get;
   2867         param = ref_clock;
   2868         lane_control_support = TRUE;
   2869         PHYMOD_FEC_CL108_CLR(*value);
   2870         PHYMOD_FEC_CL91_SET(*value);
   2871         break;
   2872     case SOC_PHY_CONTROL_FORWARD_ERROR_CORRECTION_CL108:
   2873         handler = control_handler_fec_get;
   2874         param = ref_clock;
   2875         lane_control_support = TRUE;
   2876         PHYMOD_FEC_CL91_CLR(*value);
   2877         PHYMOD_FEC_CL108_SET(*value);
   2878         break;
   2879     case SOC_PHY_CONTROL_AUTONEG_FEC_OVERRIDE:
   2880         handler = control_handler_fec_override_get;
   2881         lane_control_support = TRUE;
   2882         break;        
   2883     /* RX_LOW_FREQ_PEAK_FILTER */
   2884     case SOC_PHY_CONTROL_RX_LOW_FREQ_PEAK_FILTER:
   2885         handler = control_handler_rx_low_freq_filter_get;
   2886         lane_control_support = TRUE;
   2887         break;
   2888     /* RX_HIGH_FREQ_PEAK_FILTER */
   2889     case SOC_PHY_CONTROL_RX_HIGH_FREQ_PEAK_FILTER:
   2890         handler = control_handler_rx_high_freq_filter_get;
   2891         lane_control_support = TRUE;
   2892         break;
   2893     /* RX_SEQ_DONE */
   2894     case SOC_PHY_CONTROL_RX_SEQ_DONE:
   2895        handler = control_handler_rx_seq_done_get;
   2896        lane_control_support = TRUE;
   2897        break;
   2898     case SOC_PHY_CONTROL_TX_POLARITY:
   2899         handler = control_handler_tx_polarity_get;
   2900         lane_control_support = TRUE;
   2901         break;
   2902     case SOC_PHY_CONTROL_RX_POLARITY:
   2903         handler = control_handler_rx_polarity_get;
   2904         lane_control_support = TRUE;
   2905         break;
   2906      /* RESET */
   2907     case SOC_PHY_CONTROL_RX_RESET:
   2908         handler = control_handler_rx_reset_get;
   2909         lane_control_support = TRUE;
   2910         break;
   2911     case SOC_PHY_CONTROL_TX_RESET:
   2912         handler = control_handler_tx_reset_get;
   2913         lane_control_support = TRUE;
   2914         break;
   2915     /* POWER */
   2916     case SOC_PHY_CONTROL_POWER:
   2917         handler = control_handler_power_get;
   2918         lane_control_support = TRUE;
   2919         break;
   2920     case SOC_PHY_CONTROL_FIRMWARE_MODE:
   2921     case SOC_PHY_CONTROL_FIRMWARE_BR_DFE_ENABLE:
   2922     case SOC_PHY_CONTROL_FIRMWARE_LP_DFE_ENABLE:
   2923     case SOC_PHY_CONTROL_FIRMWARE_DFE_ENABLE:
   2924     case SOC_PHY_CONTROL_FIRMWARE_CL72_RESTART_TIMEOUT_ENABLE:
   2925     case SOC_PHY_CONTROL_FIRMWARE_CL72_AUTO_POLARITY_ENABLE:
   2926     case SOC_PHY_CONTROL_FIRMWARE_RX_FORCE_EXTENDED_REACH_ENABLE:
   2927     case SOC_PHY_CONTROL_FIRMWARE_RX_FORCE_NORMAL_REACH_ENABLE:
   2928         handler = control_handler_firmware_mode_get;
   2929         lane_control_support = TRUE;
   2930         param = control;
   2931         break; 
   2932     case SOC_PHY_CONTROL_MEDIUM_TYPE:
   2933         handler = control_handler_medium_type_get;
   2934         lane_control_support = TRUE;
   2935         param = ref_clock;
   2936         break;
   2937 
   2938     case SOC_PHY_CONTROL_INTERFACE:
   2939         /* value=interface type, control=switch param */ 
   2940         handler = control_handler_interface_get;
   2941         param = ref_clock;
   2942         lane_control_support = TRUE;
   2943         break;
   2944 
   2945     case SOC_PHY_CONTROL_LOOPBACK_REMOTE:
   2946         /* handler = control_handler_loopback_remote_pcs_get; */
   2947         handler = control_handler_loopback_remote_get;
   2948         lane_control_support = TRUE;
   2949         break;
   2950 
   2951     case SOC_PHY_CONTROL_GPIO_CONFIG:
   2952         handler = control_handler_gpio_config_get;
   2953         lane_control_support = TRUE;
   2954         break;
   2955 
   2956     case SOC_PHY_CONTROL_GPIO_VALUE:
   2957         handler = control_handler_gpio_pin_value_get;
   2958         lane_control_support = TRUE;
   2959         break;
   2960 
   2961 
   2962     case SOC_PHY_CONTROL_INTR_STATUS:
   2963         handler = control_handler_intr_status_get;
   2964         lane_control_support = TRUE;
   2965         break;
   2966 
   2967     case SOC_PHY_CONTROL_INTR_MASK:
   2968         handler = control_handler_intr_enable_get;
   2969         lane_control_support = TRUE;
   2970         break;
   2971 
   2972     case SOC_PHY_CONTROL_UNRELIABLE_LOS:
   2973         handler = control_handler_unreliable_los_enable_get;
   2974         lane_control_support = TRUE;
   2975         break;
   2976     case SOC_PHY_CONTROL_EYE_VAL_HZ_L:
   2977         handler = control_handler_eye_margin_hz_l_get;
   2978         lane_control_support = TRUE;
   2979         break;
   2980     case SOC_PHY_CONTROL_EYE_VAL_HZ_R:
   2981         handler = control_handler_eye_margin_hz_r_get;
   2982         lane_control_support = TRUE;
   2983         break;
   2984     case SOC_PHY_CONTROL_EYE_VAL_VT_U:
   2985         handler = control_handler_eye_margin_vt_u_get;
   2986         lane_control_support = TRUE;
   2987         break;
   2988     case SOC_PHY_CONTROL_EYE_VAL_VT_D:
   2989         handler = control_handler_eye_margin_vt_d_get;
   2990         lane_control_support = TRUE;
   2991         break;
   2992     case SOC_PHY_CONTROL_AUTONEG_MODE:
   2993         handler = control_handler_autoneg_get;
   2994         lane_control_support = TRUE;
   2995         break;
   2996     case SOC_PHY_CONTROL_LINKDOWN_TRANSMIT:
   2997 	handler = control_handler_linkdown_transmit_get;
   2998 	lane_control_support = TRUE;
   2999 	break;
   3000     case SOC_PHY_CONTROL_HG2_BCM_CODEC_ENABLE:
   3001         handler = control_handler_pm_codec_enable_get;
   3002         lane_control_support = TRUE;
   3003         break;
   3004     case SOC_PHY_CONTROL_EEE:
   3005         handler = control_handler_eee_get;
   3006         lane_control_support = TRUE;
   3007         break;
   3008     case SOC_PHY_CONTROL_PAM4_TX_PATTERN_ENABLE:
   3009         handler = control_handler_pam4_tx_pattern_get;
   3010         lane_control_support = TRUE;
   3011         break;
   3012     case SOC_PHY_CONTROL_PCS_MODE:
   3013         handler = control_handler_pcs_mode_get;
   3014         lane_control_support = TRUE;
   3015         break;
   3016     case SOC_PHY_CONTROL_FEC_CORRECTED_BLOCK_COUNT:
   3017         handler = control_handler_fec_counter_get;
   3018         lane_control_support = TRUE;
   3019         break;
   3020     case SOC_PHY_CONTROL_FEC_UNCORRECTED_BLOCK_COUNT:
   3021         handler = control_handler_fec_counter_get;
   3022         lane_control_support = TRUE;
   3023         param = 1;
   3024         break;
   3025     case SOC_PHY_CONTROL_FEC_CORRECTED_CODEWORD_COUNT:
   3026         handler = control_handler_fec_cl91_counter_get;
   3027         break;
   3028     case SOC_PHY_CONTROL_FEC_UNCORRECTED_CODEWORD_COUNT:
   3029         handler = control_handler_fec_cl91_counter_get;
   3030         param = 1;
   3031         break;
   3032     case SOC_PHY_CONTROL_PARALLEL_DETECTION:
   3033     case SOC_PHY_CONTROL_PARALLEL_DETECTION_10G:
   3034         handler = control_handler_pdet_get;
   3035         lane_control_support = TRUE;
   3036         param = control;
   3037         break;
   3038     case SOC_PHY_CONTROL_TX_PAM4_PRECODER_ENABLE:
   3039         handler = control_handler_tx_pam4_precoder_enable_get;
   3040         lane_control_support = TRUE;
   3041         break;
   3042     case SOC_PHY_CONTROL_LP_TX_PRECODER_ENABLE:
   3043         handler = control_handler_lp_tx_precoder_enable_get;
   3044         lane_control_support = TRUE;
   3045         break;
   3046     case SOC_PHY_CONTROL_RX_PPM:
   3047         handler = control_handler_rx_ppm_get;
   3048         lane_control_support = TRUE;
   3049         break;
   3050     case SOC_PHY_CONTROL_FAST_BER_PROJ:
   3051         handler = control_handler_fast_ber_proj_get;
   3052         lane_control_support = TRUE;
   3053         break;
   3054     case SOC_PHY_CONTROL_CHANNEL_LOSS_HINT:
   3055         handler = control_handler_channel_loss_hint_get;
   3056         lane_control_support = TRUE;
   3057         break;
   3058     case SOC_PHY_CONTROL_FEC_BYPASS_INDICATION_ENABLE:
   3059         handler = control_handler_fec_bypass_indication_get;
   3060         lane_control_support = TRUE;
   3061         break;
   3062     default: 
   3063         return SOC_E_UNAVAIL;
   3064         break; 
   3065     }
   3066     if(is_lane_control && !lane_control_support){
   3067         return SOC_E_UNAVAIL;
   3068     }
   3069     if(handler == NULL){
   3070         return SOC_E_INTERNAL;
   3071     }
   3072 
   3073     if(phys[0].access.lane_mask){
   3074         SOC_IF_ERROR_RETURN(handler(unit, &phys[0], param, value));
   3075     }
   3076 
   3077     if(control == SOC_PHY_CONTROL_PRBS_RX_STATUS){
   3078         uint32 value2 = 0;
   3079         for(i = 1 ; i < nof_phys ; i++){
   3080 
   3081             /* if lane mask is zero, skip it. */
   3082             if(phys[i].access.lane_mask){
   3083                 SOC_IF_ERROR_RETURN(handler(unit, &phys[i], param, &value2));
   3084 
   3085                 /* -1 !prbs_lock ,  -2 prbs_lock_loss, 0 1 2 ... prbs err cnt.
   3086                    -1 supersede everybody.
   3087                    -2 is next in line
   3088                     0 ..   treated equally. */
   3089 
   3090             if( ((int)(*value)) != -1 ) {
   3091                 if((int)value2 < 0){
   3092                         *value = value2;
   3093                 } else if( ((int)(*value)) >=0 ) {
   3094                         *value += value2;
   3095                     }
   3096                 }
   3097             }
   3098         }
   3099     } else {
   3100         for(i = 1 ; i < nof_phys ; i++){
   3101             if(phys[i].access.lane_mask){
   3102                 SOC_IF_ERROR_RETURN(handler(unit, &phys[i], param, value));
   3103             }
   3104         }
   3105     }
   3106 
   3107     return SOC_E_NONE;
   3108 }
   3109 
   3110 int soc_port_control_set_wrapper(int unit, phymod_ref_clk_t ref_clock, int is_lane_control, phymod_phy_access_t *phys, int nof_phys, soc_phy_control_t control, uint32 value)
   3111 {
   3112     control_set_handler_f handler = NULL;
   3113     uint32 param2 = 0;
   3114     int lane_control_support = FALSE;
   3115     int i;
   3116 
   3117     if ((control < 0) || (control >= SOC_PHY_CONTROL_COUNT)) {
   3118         return (SOC_E_PARAM);
   3119     }
   3120 
   3121     switch(control) {
   3122     case SOC_PHY_CONTROL_TX_FIR_MODE:
   3123         handler = control_handler_tx_fir_mode_set;
   3124         lane_control_support = TRUE;
   3125         break;
   3126     case SOC_PHY_CONTROL_TX_FIR_PRE2:
   3127         handler = control_handler_tx_fir_pre2_set;
   3128         lane_control_support = TRUE;
   3129         break;
   3130     case SOC_PHY_CONTROL_TX_FIR_PRE:
   3131         handler = control_handler_tx_fir_pre_set;
   3132         lane_control_support = TRUE;
   3133         break;
   3134     case SOC_PHY_CONTROL_TX_FIR_MAIN:
   3135         handler = control_handler_tx_fir_main_set;
   3136         lane_control_support = TRUE;
   3137         break;
   3138     case SOC_PHY_CONTROL_TX_FIR_POST:
   3139         handler = control_handler_tx_fir_post_set;
   3140         lane_control_support = TRUE;
   3141         break;
   3142     case SOC_PHY_CONTROL_TX_FIR_POST2:
   3143         handler = control_handler_tx_fir_post2_set;
   3144         lane_control_support = TRUE;
   3145         break;
   3146     case SOC_PHY_CONTROL_TX_FIR_POST3:
   3147         handler = control_handler_tx_fir_post3_set;
   3148         lane_control_support = TRUE;
   3149         break;
   3150     case SOC_PHY_CONTROL_LINK_TRAINING_INIT_TX_FIR_POST:
   3151         handler = control_handler_link_training_tx_fir_post_set;
   3152         lane_control_support = TRUE;
   3153         break;
   3154     /* PREEMPHASIS */
   3155     case SOC_PHY_CONTROL_PREEMPHASIS:
   3156         handler = control_handler_preemphasis_set;
   3157         lane_control_support = TRUE;
   3158         break;
   3159     case SOC_PHY_CONTROL_PREEMPHASIS_LANE0:
   3160         phys->access.lane_mask = 0x1 ;
   3161         handler = control_handler_preemphasis_set;
   3162         lane_control_support = TRUE;
   3163         break;
   3164     case SOC_PHY_CONTROL_PREEMPHASIS_LANE1:
   3165         phys->access.lane_mask = 0x2 ;
   3166         handler = control_handler_preemphasis_set;
   3167         lane_control_support = TRUE;
   3168         break;
   3169     case SOC_PHY_CONTROL_PREEMPHASIS_LANE2:
   3170         phys->access.lane_mask = 0x4 ;
   3171         handler = control_handler_preemphasis_set;
   3172         lane_control_support = TRUE;
   3173         break;
   3174     case SOC_PHY_CONTROL_PREEMPHASIS_LANE3:
   3175         phys->access.lane_mask = 0x8 ;
   3176         handler = control_handler_preemphasis_set;
   3177         lane_control_support = TRUE;
   3178         break;
   3179     /* DRIVER CURRENT */
   3180     case SOC_PHY_CONTROL_DRIVER_CURRENT_LANE0:
   3181          phys->access.lane_mask = 0x1 ;
   3182         handler = control_handler_driver_current_set;
   3183         lane_control_support = TRUE;
   3184         break;
   3185     case SOC_PHY_CONTROL_DRIVER_CURRENT_LANE1:
   3186          phys->access.lane_mask = 0x2 ;
   3187         handler = control_handler_driver_current_set;
   3188         lane_control_support = TRUE;
   3189         break;
   3190     case SOC_PHY_CONTROL_DRIVER_CURRENT_LANE2:
   3191          phys->access.lane_mask = 0x4 ;
   3192         handler = control_handler_driver_current_set;
   3193         lane_control_support = TRUE;
   3194         break;
   3195     case SOC_PHY_CONTROL_DRIVER_CURRENT_LANE3:
   3196          phys->access.lane_mask = 0x8 ;
   3197         handler = control_handler_driver_current_set;
   3198         lane_control_support = TRUE;
   3199         break;
   3200     case SOC_PHY_CONTROL_DRIVER_CURRENT:
   3201         handler = control_handler_driver_current_set;
   3202         lane_control_support = TRUE;
   3203         break;
   3204     case SOC_PHY_CONTROL_TX_FIR_DRIVERMODE:
   3205         handler = control_handler_tx_fir_drivermode_set;
   3206         lane_control_support = TRUE;
   3207         break;
   3208      /* TX LANE SQUELCH */
   3209     case SOC_PHY_CONTROL_TX_LANE_SQUELCH:
   3210         handler = control_handler_tx_squelch;
   3211         lane_control_support = TRUE;
   3212         break;
   3213      /* RX LANE SQUELCH */
   3214     case SOC_PHY_CONTROL_RX_LANE_SQUELCH:
   3215         handler = control_handler_rx_squelch;
   3216         lane_control_support = TRUE;
   3217         break;
   3218     /* RX PEAK FILTER */
   3219     case SOC_PHY_CONTROL_RX_PEAK_FILTER:
   3220         handler = control_handler_rx_peak_filter_set;
   3221         lane_control_support = TRUE;
   3222         break;
   3223     /* RX VGA */
   3224     case SOC_PHY_CONTROL_RX_VGA:
   3225         handler = control_handler_rx_vga_set;
   3226         lane_control_support = TRUE;
   3227         break;
   3228     /* RX VGA RELEASE */
   3229     case SOC_PHY_CONTROL_RX_VGA_RELEASE:
   3230         handler = control_handler_rx_vga_release;
   3231         lane_control_support = TRUE;
   3232         break;
   3233     /* RX TAP */
   3234     case SOC_PHY_CONTROL_RX_TAP1:
   3235         handler = control_handler_rx_tap_set;
   3236         lane_control_support = TRUE;
   3237         break;
   3238     case SOC_PHY_CONTROL_RX_TAP2:
   3239         handler = control_handler_rx_tap_set;
   3240         lane_control_support = TRUE;
   3241         param2 = 1;
   3242         break;
   3243     case SOC_PHY_CONTROL_RX_TAP3:
   3244         handler = control_handler_rx_tap_set;
   3245         lane_control_support = TRUE;
   3246         param2 = 2;
   3247         break;
   3248     case SOC_PHY_CONTROL_RX_TAP4:
   3249         handler = control_handler_rx_tap_set;
   3250         lane_control_support = TRUE;
   3251         param2 = 3;
   3252         break;
   3253     case SOC_PHY_CONTROL_RX_TAP5:
   3254         handler = control_handler_rx_tap_set;
   3255         lane_control_support = TRUE;
   3256         param2 = 4;
   3257         break;
   3258     case SOC_PHY_CONTROL_RX_TAP6:
   3259         handler = control_handler_rx_tap_set;
   3260         lane_control_support = TRUE;
   3261         param2 = 5;
   3262         break;
   3263     case SOC_PHY_CONTROL_RX_TAP1_RELEASE:
   3264         handler = control_handler_rx_tap_release;
   3265         lane_control_support = TRUE;
   3266         break;
   3267     case SOC_PHY_CONTROL_RX_TAP2_RELEASE:
   3268         handler = control_handler_rx_tap_release;
   3269         lane_control_support = TRUE;
   3270         param2 = 1;
   3271         break;
   3272     case SOC_PHY_CONTROL_RX_TAP3_RELEASE:
   3273         handler = control_handler_rx_tap_release;
   3274         lane_control_support = TRUE;
   3275         param2 = 2;
   3276         break;
   3277     case SOC_PHY_CONTROL_RX_TAP4_RELEASE:
   3278         handler = control_handler_rx_tap_release;
   3279         lane_control_support = TRUE;
   3280         param2 = 3;
   3281         break;
   3282     case SOC_PHY_CONTROL_RX_TAP5_RELEASE:
   3283         handler = control_handler_rx_tap_release;
   3284         lane_control_support = TRUE;
   3285         param2 = 4;
   3286         break;
   3287     case SOC_PHY_CONTROL_RX_TAP6_RELEASE:
   3288         handler = control_handler_rx_tap_release;
   3289         lane_control_support = TRUE;
   3290         param2 = 5;
   3291         break;
   3292     case SOC_PHY_CONTROL_RX_ADAPTATION_RESUME:
   3293         handler = control_handler_rx_adaptation_resume;
   3294         lane_control_support = TRUE;
   3295         break;
   3296     /* PHASE INTERPOLATOR */
   3297     case SOC_PHY_CONTROL_PHASE_INTERP:
   3298     case SOC_PHY_CONTROL_TX_PPM_ADJUST:
   3299         handler = control_handler_pi_control_set;
   3300         lane_control_support = TRUE;
   3301         break;
   3302     /* POLARITY */
   3303     case SOC_PHY_CONTROL_RX_POLARITY:
   3304         handler = control_handler_rx_polarity_set;
   3305         lane_control_support = TRUE;
   3306         break;
   3307     case SOC_PHY_CONTROL_TX_POLARITY:
   3308         handler = control_handler_tx_polarity_set;
   3309         lane_control_support = TRUE;
   3310         break;
   3311     /* RESET */
   3312     case SOC_PHY_CONTROL_RX_RESET:
   3313         handler = control_handler_rx_reset_set;
   3314         lane_control_support = TRUE;
   3315         break;
   3316     case SOC_PHY_CONTROL_TX_RESET:
   3317         handler = control_handler_tx_reset_set;
   3318         lane_control_support = TRUE;
   3319         break;
   3320 
   3321     case SOC_PHY_CONTROL_DUMP:
   3322         handler = control_handler_dsc_dump_set;
   3323         lane_control_support = TRUE;
   3324         break;
   3325 
   3326     /* CL72 ENABLE */
   3327     case SOC_PHY_CONTROL_CL72:
   3328         handler = control_handler_cl72_enable_set;
   3329         lane_control_support = TRUE;
   3330         break;
   3331 
   3332     /* SHORT_CHANNEL_MODE ENABLE */
   3333     case SOC_PHY_CONTROL_SHORT_CHANNEL_MODE:
   3334         handler = control_handler_short_chn_mode_enable_set;
   3335         lane_control_support = TRUE;
   3336         break;
   3337 
   3338     /* LANE SWAP */
   3339     case SOC_PHY_CONTROL_LANE_SWAP:
   3340         handler = control_handler_lane_map_set;
   3341         break;
   3342 
   3343     /* TX PATTERN */
   3344         
   3345     case SOC_PHY_CONTROL_TX_PATTERN_LENGTH:
   3346         handler = control_handler_pattern_length_set;
   3347         lane_control_support = TRUE;
   3348         break ;
   3349     case SOC_PHY_CONTROL_TX_PATTERN_GEN_ENABLE:
   3350         handler = control_handler_pattern_enable_set;
   3351         lane_control_support = TRUE;
   3352         break ;
   3353     case SOC_PHY_CONTROL_TX_PATTERN_DATA0:
   3354         handler = control_handler_pattern_config_set;
   3355         lane_control_support = TRUE;
   3356         param2 = 0;
   3357         break;
   3358     case SOC_PHY_CONTROL_TX_PATTERN_DATA1:
   3359         handler = control_handler_pattern_config_set;
   3360         lane_control_support = TRUE;
   3361         param2 = 1;
   3362         break;
   3363     case SOC_PHY_CONTROL_TX_PATTERN_DATA2:
   3364         handler = control_handler_pattern_config_set;
   3365         lane_control_support = TRUE;
   3366         param2 = 2;
   3367         break;
   3368     case SOC_PHY_CONTROL_TX_PATTERN_DATA3:
   3369         handler = control_handler_pattern_config_set;
   3370         lane_control_support = TRUE;
   3371         param2 = 3;
   3372         break;
   3373     case SOC_PHY_CONTROL_TX_PATTERN_DATA4:
   3374         handler = control_handler_pattern_config_set;
   3375         lane_control_support = TRUE;
   3376         param2 = 4;
   3377         break;
   3378     case SOC_PHY_CONTROL_TX_PATTERN_DATA5:
   3379         handler = control_handler_pattern_config_set;
   3380         lane_control_support = TRUE;
   3381         param2 = 5;
   3382         break;
   3383     case SOC_PHY_CONTROL_TX_PATTERN_DATA6:
   3384         handler = control_handler_pattern_config_set;
   3385         lane_control_support = TRUE;
   3386         param2 = 6;
   3387         break;
   3388     case SOC_PHY_CONTROL_TX_PATTERN_DATA7:
   3389         handler = control_handler_pattern_config_set;
   3390         lane_control_support = TRUE;
   3391         param2 = 7;
   3392         break;
   3393     /* PRBS */
   3394     case SOC_PHY_CONTROL_PRBS_POLYNOMIAL:
   3395         handler = control_handler_prbs_poly_set;
   3396         lane_control_support = TRUE;
   3397         break;
   3398     case SOC_PHY_CONTROL_PRBS_TX_INVERT_DATA:
   3399         handler = control_handler_prbs_tx_invert_data_set;
   3400         lane_control_support = TRUE;
   3401         break;
   3402     case SOC_PHY_CONTROL_PRBS_TX_ENABLE:
   3403         handler = control_handler_prbs_tx_enable_set;
   3404         lane_control_support = TRUE;
   3405         break;
   3406     case SOC_PHY_CONTROL_PRBS_RX_INVERT_DATA:
   3407         handler = control_handler_prbs_rx_invert_data_set;
   3408         lane_control_support = TRUE;
   3409         break;
   3410     case SOC_PHY_CONTROL_PRBS_RX_ENABLE:
   3411         handler = control_handler_prbs_rx_enable_set;
   3412         lane_control_support = TRUE;
   3413         break;
   3414     case SOC_PHY_CONTROL_PRBS_DECOUPLED_TX_POLYNOMIAL:
   3415         handler = control_handler_prbs_tx_poly_set;
   3416         lane_control_support = TRUE;
   3417         break;
   3418     case SOC_PHY_CONTROL_PRBS_DECOUPLED_TX_INVERT_DATA:
   3419         handler = control_handler_prbs_tx_invert_data_set;
   3420         lane_control_support = TRUE;
   3421         break;
   3422     case SOC_PHY_CONTROL_PRBS_DECOUPLED_TX_ENABLE:
   3423         handler = control_handler_prbs_tx_enable_set;
   3424         lane_control_support = TRUE;
   3425         break; 
   3426     case SOC_PHY_CONTROL_PRBS_DECOUPLED_RX_POLYNOMIAL:
   3427         handler = control_handler_prbs_rx_poly_set;
   3428         lane_control_support = TRUE;
   3429         break;
   3430     case SOC_PHY_CONTROL_PRBS_DECOUPLED_RX_INVERT_DATA:
   3431         handler = control_handler_prbs_rx_invert_data_set;
   3432         lane_control_support = TRUE;
   3433         break;
   3434     case SOC_PHY_CONTROL_PRBS_DECOUPLED_RX_ENABLE:
   3435         handler = control_handler_prbs_rx_enable_set;
   3436         lane_control_support = TRUE;
   3437         break; 
   3438 
   3439     /* LOOPBACK */
   3440     case SOC_PHY_CONTROL_LOOPBACK_INTERNAL:
   3441         handler = control_handler_loopback_internal_set;
   3442         lane_control_support = TRUE;
   3443        break;
   3444     case SOC_PHY_CONTROL_LOOPBACK_PMD:
   3445         handler = control_handler_loopback_pmd_set;
   3446         lane_control_support = TRUE;
   3447        break;
   3448 
   3449     case SOC_PHY_CONTROL_LOOPBACK_REMOTE:
   3450         /* handler = control_handler_loopback_remote_pcs_set; */
   3451         handler = control_handler_loopback_remote_set;
   3452         lane_control_support = TRUE;
   3453         break;
   3454     case SOC_PHY_CONTROL_LOOPBACK_REMOTE_PCS_BYPASS:
   3455         handler = control_handler_loopback_remote_set;
   3456         lane_control_support = TRUE;
   3457         break;
   3458 
   3459     /* SCRAMBLER */
   3460     case SOC_PHY_CONTROL_SCRAMBLER:
   3461         handler = control_handler_scrambler_set;
   3462         lane_control_support = TRUE;
   3463         param2 = ref_clock;
   3464         break;
   3465     case SOC_PHY_CONTROL_FORWARD_ERROR_CORRECTION:
   3466         handler = control_handler_fec_set;
   3467         lane_control_support = TRUE;
   3468         param2 = ref_clock;
   3469         break;
   3470     case SOC_PHY_CONTROL_FORWARD_ERROR_CORRECTION_CL91:
   3471         handler = control_handler_fec_set;
   3472         lane_control_support = TRUE;
   3473         param2 = ref_clock;
   3474         PHYMOD_FEC_CL108_CLR(value);
   3475         PHYMOD_FEC_CL91_SET(value);
   3476         break;
   3477     case SOC_PHY_CONTROL_FORWARD_ERROR_CORRECTION_CL108:
   3478         handler = control_handler_fec_set;
   3479         lane_control_support = TRUE;
   3480         param2 = ref_clock;
   3481         PHYMOD_FEC_CL91_CLR(value);
   3482         PHYMOD_FEC_CL108_SET(value);
   3483         break;
   3484     case SOC_PHY_CONTROL_AUTONEG_FEC_OVERRIDE:
   3485         handler = control_handler_fec_override_set;
   3486         lane_control_support = TRUE;
   3487         break;        
   3488     case SOC_PHY_CONTROL_CHANNEL_LOSS_HINT:
   3489         handler = control_handler_channel_loss_hint_set;
   3490         lane_control_support = TRUE;
   3491         break;
   3492 #if defined(TODO_CONTROLS) /*not implemented yet*/
   3493     /* 8B10B */
   3494     case SOC_PHY_CONTROL_8B10B:
   3495         rv = tsce_8b10b_set(pmc, value);
   3496         break;
   3497 
   3498     /* 64B65B */
   3499     case SOC_PHY_CONTROL_64B66B:
   3500         rv = tsce_64b65b_set(pmc, value);
   3501         break;
   3502 #endif /*not implemented yet*/
   3503 
   3504     /* POWER */
   3505     case SOC_PHY_CONTROL_POWER:
   3506         handler = control_handler_power_set;
   3507         lane_control_support = TRUE;
   3508         break;
   3509 
   3510     /* RX_LOW_FREQ_PEAK_FILTER */
   3511     case SOC_PHY_CONTROL_RX_LOW_FREQ_PEAK_FILTER:
   3512         handler = control_handler_rx_low_freq_filter_set;
   3513         lane_control_support = TRUE;
   3514         break;
   3515     /* RX_HIGH_FREQ_PEAK_FILTER */
   3516     case SOC_PHY_CONTROL_RX_HIGH_FREQ_PEAK_FILTER:
   3517         handler = control_handler_rx_high_freq_filter_set;
   3518         lane_control_support = TRUE;
   3519         break;
   3520 
   3521 #if defined(TODO_CONTROLS) /*not implemented yet*/
   3522     /* TX_PPM_ADJUST */
   3523     case SOC_PHY_CONTROL_TX_PPM_ADJUST:
   3524        handler = ;
   3525        break;
   3526     /* VCO_FREQ */
   3527     case SOC_PHY_CONTROL_VCO_FREQ:
   3528        rv = tsce_vco_freq_set(pmc, value);
   3529        break;
   3530 
   3531     /* PLL_DIVIDER */
   3532     case SOC_PHY_CONTROL_PLL_DIVIDER:
   3533        rv = tsce_pll_divider_set(pmc, value);
   3534        break;
   3535 
   3536     /* OVERSAMPLE_MODE */
   3537     case SOC_PHY_CONTROL_OVERSAMPLE_MODE:
   3538        rv = tsce_oversample_mode_set(pmc, value);
   3539        break;
   3540 
   3541     /* REF_CLK */
   3542     case SOC_PHY_CONTROL_REF_CLK:
   3543        rv = tsce_ref_clk_set(pmc, value);
   3544        break;
   3545     /* DRIVER_SUPPLY */
   3546     case SOC_PHY_CONTROL_DRIVER_SUPPLY:
   3547        rv = tsce_driver_supply_set(pmc, value);
   3548        break;
   3549 #endif /*not implemented yet*/
   3550     /* RX_SEQ_TOGGLE */
   3551     case SOC_PHY_CONTROL_RX_SEQ_TOGGLE:
   3552        handler = control_handler_rx_seq_toggle_set;
   3553        lane_control_support = TRUE;
   3554        break;
   3555 
   3556     case SOC_PHY_CONTROL_FIRMWARE_MODE:
   3557     case SOC_PHY_CONTROL_FIRMWARE_BR_DFE_ENABLE:
   3558     case SOC_PHY_CONTROL_FIRMWARE_LP_DFE_ENABLE:
   3559     case SOC_PHY_CONTROL_FIRMWARE_DFE_ENABLE:
   3560     case SOC_PHY_CONTROL_FIRMWARE_CL72_RESTART_TIMEOUT_ENABLE:
   3561     case SOC_PHY_CONTROL_FIRMWARE_CL72_AUTO_POLARITY_ENABLE:
   3562     case SOC_PHY_CONTROL_FIRMWARE_RX_FORCE_EXTENDED_REACH_ENABLE:
   3563     case SOC_PHY_CONTROL_FIRMWARE_RX_FORCE_NORMAL_REACH_ENABLE:
   3564         handler = control_handler_firmware_mode_set;
   3565         lane_control_support = TRUE;
   3566         param2 = control;
   3567         break; 
   3568     case SOC_PHY_CONTROL_MEDIUM_TYPE:
   3569         handler = control_handler_medium_type_set;
   3570         lane_control_support = TRUE;
   3571         param2 = ref_clock;
   3572         break;
   3573     case SOC_PHY_CONTROL_INTERFACE:
   3574         /* value=interface type, control=switch param */ 
   3575         handler = control_handler_interface_set;
   3576         param2 = ref_clock;
   3577         lane_control_support = TRUE;
   3578         break;
   3579 
   3580     case SOC_PHY_CONTROL_GPIO_CONFIG:
   3581         handler = control_handler_gpio_config_set;
   3582         lane_control_support = TRUE;
   3583         break;
   3584 
   3585     case SOC_PHY_CONTROL_GPIO_VALUE:
   3586         handler = control_handler_gpio_pin_value_set;
   3587         lane_control_support = TRUE;
   3588         break;
   3589 
   3590     case SOC_PHY_CONTROL_INTR_MASK:
   3591         handler = control_handler_intr_enable_set;
   3592         lane_control_support = TRUE;
   3593         break;
   3594 
   3595     case SOC_PHY_CONTROL_UNRELIABLE_LOS:
   3596         handler = control_handler_unreliable_los_enable_set;
   3597         lane_control_support = TRUE;
   3598         break;
   3599 
   3600     /* LINKDOWN TRANSMIT */
   3601     /* Non-legacy phy no need to do register setting */
   3602     case SOC_PHY_CONTROL_LINKDOWN_TRANSMIT:
   3603         handler = control_handler_linkdown_transmit_set;
   3604 	lane_control_support = TRUE;
   3605 	break;
   3606 
   3607     case SOC_PHY_CONTROL_HG2_BCM_CODEC_ENABLE:
   3608         handler = control_handler_pm_codec_enable_set;
   3609         lane_control_support = TRUE;
   3610         break;
   3611     case SOC_PHY_CONTROL_EEE:
   3612         handler = control_handler_eee_set;
   3613         lane_control_support = TRUE;
   3614         break;
   3615     case SOC_PHY_CONTROL_PAM4_TX_PATTERN_ENABLE:
   3616         handler = control_handler_pam4_tx_pattern_set;
   3617         lane_control_support = TRUE;
   3618         break;
   3619     case SOC_PHY_CONTROL_PCS_MODE:
   3620         handler = control_handler_pcs_mode_set;
   3621         lane_control_support = TRUE;
   3622         break;
   3623     case SOC_PHY_CONTROL_PARALLEL_DETECTION:
   3624     case SOC_PHY_CONTROL_PARALLEL_DETECTION_10G:
   3625         handler = control_handler_pdet_set;
   3626         lane_control_support = TRUE;
   3627         param2 = control;
   3628         break;
   3629     case SOC_PHY_CONTROL_TX_PAM4_PRECODER_ENABLE:
   3630         handler = control_handler_tx_pam4_precoder_enable_set;
   3631         lane_control_support = TRUE;
   3632         break;
   3633     case SOC_PHY_CONTROL_LP_TX_PRECODER_ENABLE:
   3634         handler = control_handler_lp_tx_precoder_enable_set;
   3635         lane_control_support = TRUE;
   3636         break;
   3637     case SOC_PHY_CONTROL_FEC_BYPASS_INDICATION_ENABLE:
   3638         handler = control_handler_fec_bypass_indication_set;
   3639         lane_control_support = TRUE;
   3640         break;
   3641     default:
   3642         return SOC_E_UNAVAIL;
   3643         break; 
   3644     }
   3645 
   3646     if(is_lane_control && !lane_control_support){
   3647         return SOC_E_UNAVAIL;
   3648     }
   3649 
   3650     if(handler == NULL){
   3651         return SOC_E_INTERNAL;
   3652     }
   3653 
   3654     for(i = 0 ; i < nof_phys ; i++){
   3655         /* if lane mask is 0, skip it. */
   3656         if( phys[i].access.lane_mask) {    
   3657             SOC_IF_ERROR_RETURN(handler(unit, &phys[i], value, param2));
   3658         }
   3659     }
   3660 
   3661     return SOC_E_NONE;
   3662 }
   3663 
   3664 int soc_portctrl_phy_tx_set(int unit, phymod_phy_access_t *phy_access, phymod_tx_t *phy_tx)
   3665 {
   3666 
   3667     SOC_IF_ERROR_RETURN(phymod_phy_tx_set(phy_access, phy_tx));
   3668 
   3669     return SOC_E_NONE;
   3670 }
   3671 
   3672 int soc_portctrl_phy_tx_get(int unit, phymod_phy_access_t *phy_access, phymod_tx_t *phy_tx)
   3673 {
   3674 
   3675     SOC_IF_ERROR_RETURN(phymod_phy_tx_get(phy_access, phy_tx));
   3676 
   3677     return SOC_E_NONE;
   3678 }
   3679 #undef _ERR_MSG_MODULE_NAME
   3680 #else
   3681 int phymod_port_control_not_empty;
   3682 #endif