@@ -39,6 +39,8 @@ static struct mac_ops rpm_mac_ops = {
3939 .mac_get_pfc_frm_cfg = rpm_lmac_get_pfc_frm_cfg ,
4040 .mac_reset = rpm_lmac_reset ,
4141 .mac_stats_reset = rpm_stats_reset ,
42+ .mac_x2p_reset = rpm_x2p_reset ,
43+ .mac_enadis_rx = rpm_enadis_rx ,
4244};
4345
4446static struct mac_ops rpm2_mac_ops = {
@@ -72,6 +74,8 @@ static struct mac_ops rpm2_mac_ops = {
7274 .mac_get_pfc_frm_cfg = rpm_lmac_get_pfc_frm_cfg ,
7375 .mac_reset = rpm_lmac_reset ,
7476 .mac_stats_reset = rpm_stats_reset ,
77+ .mac_x2p_reset = rpm_x2p_reset ,
78+ .mac_enadis_rx = rpm_enadis_rx ,
7579};
7680
7781bool is_dev_rpm2 (void * rpmd )
@@ -467,7 +471,7 @@ u8 rpm_get_lmac_type(void *rpmd, int lmac_id)
467471 int err ;
468472
469473 req = FIELD_SET (CMDREG_ID , CGX_CMD_GET_LINK_STS , req );
470- err = cgx_fwi_cmd_generic (req , & resp , rpm , 0 );
474+ err = cgx_fwi_cmd_generic (req , & resp , rpm , lmac_id );
471475 if (!err )
472476 return FIELD_GET (RESP_LINKSTAT_LMAC_TYPE , resp );
473477 return err ;
@@ -480,7 +484,7 @@ u32 rpm_get_lmac_fifo_len(void *rpmd, int lmac_id)
480484 u8 num_lmacs ;
481485 u32 fifo_len ;
482486
483- fifo_len = rpm -> mac_ops -> fifo_len ;
487+ fifo_len = rpm -> fifo_len ;
484488 num_lmacs = rpm -> mac_ops -> get_nr_lmacs (rpm );
485489
486490 switch (num_lmacs ) {
@@ -533,9 +537,9 @@ u32 rpm2_get_lmac_fifo_len(void *rpmd, int lmac_id)
533537 */
534538 max_lmac = (rpm_read (rpm , 0 , CGX_CONST ) >> 24 ) & 0xFF ;
535539 if (max_lmac > 4 )
536- fifo_len = rpm -> mac_ops -> fifo_len / 2 ;
540+ fifo_len = rpm -> fifo_len / 2 ;
537541 else
538- fifo_len = rpm -> mac_ops -> fifo_len ;
542+ fifo_len = rpm -> fifo_len ;
539543
540544 if (lmac_id < 4 ) {
541545 num_lmacs = hweight8 (lmac_info & 0xF );
@@ -699,46 +703,51 @@ int rpm_get_fec_stats(void *rpmd, int lmac_id, struct cgx_fec_stats_rsp *rsp)
699703 if (rpm -> lmac_idmap [lmac_id ]-> link_info .fec == OTX2_FEC_NONE )
700704 return 0 ;
701705
706+ /* latched registers FCFECX_CW_HI/RSFEC_STAT_FAST_DATA_HI_CDC are common
707+ * for all counters. Acquire lock to ensure serialized reads
708+ */
709+ mutex_lock (& rpm -> lock );
702710 if (rpm -> lmac_idmap [lmac_id ]-> link_info .fec == OTX2_FEC_BASER ) {
703- val_lo = rpm_read (rpm , lmac_id , RPMX_MTI_FCFECX_VL0_CCW_LO );
704- val_hi = rpm_read (rpm , lmac_id , RPMX_MTI_FCFECX_CW_HI );
711+ val_lo = rpm_read (rpm , 0 , RPMX_MTI_FCFECX_VL0_CCW_LO ( lmac_id ) );
712+ val_hi = rpm_read (rpm , 0 , RPMX_MTI_FCFECX_CW_HI ( lmac_id ) );
705713 rsp -> fec_corr_blks = (val_hi << 16 | val_lo );
706714
707- val_lo = rpm_read (rpm , lmac_id , RPMX_MTI_FCFECX_VL0_NCCW_LO );
708- val_hi = rpm_read (rpm , lmac_id , RPMX_MTI_FCFECX_CW_HI );
715+ val_lo = rpm_read (rpm , 0 , RPMX_MTI_FCFECX_VL0_NCCW_LO ( lmac_id ) );
716+ val_hi = rpm_read (rpm , 0 , RPMX_MTI_FCFECX_CW_HI ( lmac_id ) );
709717 rsp -> fec_uncorr_blks = (val_hi << 16 | val_lo );
710718
711719 /* 50G uses 2 Physical serdes lines */
712720 if (rpm -> lmac_idmap [lmac_id ]-> link_info .lmac_type_id ==
713721 LMAC_MODE_50G_R ) {
714- val_lo = rpm_read (rpm , lmac_id ,
715- RPMX_MTI_FCFECX_VL1_CCW_LO );
716- val_hi = rpm_read (rpm , lmac_id ,
717- RPMX_MTI_FCFECX_CW_HI );
722+ val_lo = rpm_read (rpm , 0 ,
723+ RPMX_MTI_FCFECX_VL1_CCW_LO ( lmac_id ) );
724+ val_hi = rpm_read (rpm , 0 ,
725+ RPMX_MTI_FCFECX_CW_HI ( lmac_id ) );
718726 rsp -> fec_corr_blks += (val_hi << 16 | val_lo );
719727
720- val_lo = rpm_read (rpm , lmac_id ,
721- RPMX_MTI_FCFECX_VL1_NCCW_LO );
722- val_hi = rpm_read (rpm , lmac_id ,
723- RPMX_MTI_FCFECX_CW_HI );
728+ val_lo = rpm_read (rpm , 0 ,
729+ RPMX_MTI_FCFECX_VL1_NCCW_LO ( lmac_id ) );
730+ val_hi = rpm_read (rpm , 0 ,
731+ RPMX_MTI_FCFECX_CW_HI ( lmac_id ) );
724732 rsp -> fec_uncorr_blks += (val_hi << 16 | val_lo );
725733 }
726734 } else {
727735 /* enable RS-FEC capture */
728- cfg = rpm_read (rpm , 0 , RPMX_MTI_STAT_STATN_CONTROL );
736+ cfg = rpm_read (rpm , 0 , RPMX_MTI_RSFEC_STAT_STATN_CONTROL );
729737 cfg |= RPMX_RSFEC_RX_CAPTURE | BIT (lmac_id );
730- rpm_write (rpm , 0 , RPMX_MTI_STAT_STATN_CONTROL , cfg );
738+ rpm_write (rpm , 0 , RPMX_MTI_RSFEC_STAT_STATN_CONTROL , cfg );
731739
732740 val_lo = rpm_read (rpm , 0 ,
733741 RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_2 );
734- val_hi = rpm_read (rpm , 0 , RPMX_MTI_STAT_DATA_HI_CDC );
742+ val_hi = rpm_read (rpm , 0 , RPMX_MTI_RSFEC_STAT_FAST_DATA_HI_CDC );
735743 rsp -> fec_corr_blks = (val_hi << 32 | val_lo );
736744
737745 val_lo = rpm_read (rpm , 0 ,
738746 RPMX_MTI_RSFEC_STAT_COUNTER_CAPTURE_3 );
739- val_hi = rpm_read (rpm , 0 , RPMX_MTI_STAT_DATA_HI_CDC );
747+ val_hi = rpm_read (rpm , 0 , RPMX_MTI_RSFEC_STAT_FAST_DATA_HI_CDC );
740748 rsp -> fec_uncorr_blks = (val_hi << 32 | val_lo );
741749 }
750+ mutex_unlock (& rpm -> lock );
742751
743752 return 0 ;
744753}
@@ -763,3 +772,41 @@ int rpm_lmac_reset(void *rpmd, int lmac_id, u8 pf_req_flr)
763772
764773 return 0 ;
765774}
775+
776+ void rpm_x2p_reset (void * rpmd , bool enable )
777+ {
778+ rpm_t * rpm = rpmd ;
779+ int lmac_id ;
780+ u64 cfg ;
781+
782+ if (enable ) {
783+ for_each_set_bit (lmac_id , & rpm -> lmac_bmap , rpm -> max_lmac_per_mac )
784+ rpm -> mac_ops -> mac_enadis_rx (rpm , lmac_id , false);
785+
786+ usleep_range (1000 , 2000 );
787+
788+ cfg = rpm_read (rpm , 0 , RPMX_CMR_GLOBAL_CFG );
789+ rpm_write (rpm , 0 , RPMX_CMR_GLOBAL_CFG , cfg | RPM_NIX0_RESET );
790+ } else {
791+ cfg = rpm_read (rpm , 0 , RPMX_CMR_GLOBAL_CFG );
792+ cfg &= ~RPM_NIX0_RESET ;
793+ rpm_write (rpm , 0 , RPMX_CMR_GLOBAL_CFG , cfg );
794+ }
795+ }
796+
797+ int rpm_enadis_rx (void * rpmd , int lmac_id , bool enable )
798+ {
799+ rpm_t * rpm = rpmd ;
800+ u64 cfg ;
801+
802+ if (!is_lmac_valid (rpm , lmac_id ))
803+ return - ENODEV ;
804+
805+ cfg = rpm_read (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG );
806+ if (enable )
807+ cfg |= RPM_RX_EN ;
808+ else
809+ cfg &= ~RPM_RX_EN ;
810+ rpm_write (rpm , lmac_id , RPMX_MTI_MAC100X_COMMAND_CONFIG , cfg );
811+ return 0 ;
812+ }
0 commit comments