@@ -489,7 +489,7 @@ static int tx_r50_fill_result(struct phy_device *phydev, u16 tx_r50_cal_val,
489
489
u16 reg , val ;
490
490
491
491
if (phydev -> drv -> phy_id == MTK_GPHY_ID_MT7988 )
492
- bias = -2 ;
492
+ bias = -1 ;
493
493
494
494
val = clamp_val (bias + tx_r50_cal_val , 0 , 63 );
495
495
@@ -705,6 +705,11 @@ static int tx_vcm_cal_sw(struct phy_device *phydev, u8 rg_txreserve_x)
705
705
static void mt798x_phy_common_finetune (struct phy_device * phydev )
706
706
{
707
707
phy_select_page (phydev , MTK_PHY_PAGE_EXTENDED_52B5 );
708
+ /* SlvDSPreadyTime = 24, MasDSPreadyTime = 24 */
709
+ __phy_write (phydev , 0x11 , 0xc71 );
710
+ __phy_write (phydev , 0x12 , 0xc );
711
+ __phy_write (phydev , 0x10 , 0x8fae );
712
+
708
713
/* EnabRandUpdTrig = 1 */
709
714
__phy_write (phydev , 0x11 , 0x2f00 );
710
715
__phy_write (phydev , 0x12 , 0xe );
@@ -715,15 +720,56 @@ static void mt798x_phy_common_finetune(struct phy_device *phydev)
715
720
__phy_write (phydev , 0x12 , 0x0 );
716
721
__phy_write (phydev , 0x10 , 0x83aa );
717
722
718
- /* TrFreeze = 0 */
723
+ /* FfeUpdGainForce = 1(Enable), FfeUpdGainForceVal = 4 */
724
+ __phy_write (phydev , 0x11 , 0x240 );
725
+ __phy_write (phydev , 0x12 , 0x0 );
726
+ __phy_write (phydev , 0x10 , 0x9680 );
727
+
728
+ /* TrFreeze = 0 (mt7988 default) */
719
729
__phy_write (phydev , 0x11 , 0x0 );
720
730
__phy_write (phydev , 0x12 , 0x0 );
721
731
__phy_write (phydev , 0x10 , 0x9686 );
722
732
733
+ /* SSTrKp100 = 5 */
734
+ /* SSTrKf100 = 6 */
735
+ /* SSTrKp1000Mas = 5 */
736
+ /* SSTrKf1000Mas = 6 */
723
737
/* SSTrKp1000Slv = 5 */
738
+ /* SSTrKf1000Slv = 6 */
724
739
__phy_write (phydev , 0x11 , 0xbaef );
725
740
__phy_write (phydev , 0x12 , 0x2e );
726
741
__phy_write (phydev , 0x10 , 0x968c );
742
+ phy_restore_page (phydev , MTK_PHY_PAGE_STANDARD , 0 );
743
+ }
744
+
745
+ static void mt7981_phy_finetune (struct phy_device * phydev )
746
+ {
747
+ u16 val [8 ] = { 0x01ce , 0x01c1 ,
748
+ 0x020f , 0x0202 ,
749
+ 0x03d0 , 0x03c0 ,
750
+ 0x0013 , 0x0005 };
751
+ int i , k ;
752
+
753
+ /* 100M eye finetune:
754
+ * Keep middle level of TX MLT3 shapper as default.
755
+ * Only change TX MLT3 overshoot level here.
756
+ */
757
+ for (k = 0 , i = 1 ; i < 12 ; i ++ ) {
758
+ if (i % 3 == 0 )
759
+ continue ;
760
+ phy_write_mmd (phydev , MDIO_MMD_VEND1 , i , val [k ++ ]);
761
+ }
762
+
763
+ phy_select_page (phydev , MTK_PHY_PAGE_EXTENDED_52B5 );
764
+ /* ResetSyncOffset = 6 */
765
+ __phy_write (phydev , 0x11 , 0x600 );
766
+ __phy_write (phydev , 0x12 , 0x0 );
767
+ __phy_write (phydev , 0x10 , 0x8fc0 );
768
+
769
+ /* VgaDecRate = 1 */
770
+ __phy_write (phydev , 0x11 , 0x4c2a );
771
+ __phy_write (phydev , 0x12 , 0x3e );
772
+ __phy_write (phydev , 0x10 , 0x8fa4 );
727
773
728
774
/* MrvlTrFix100Kp = 3, MrvlTrFix100Kf = 2,
729
775
* MrvlTrFix1000Kp = 3, MrvlTrFix1000Kf = 2
@@ -738,7 +784,7 @@ static void mt798x_phy_common_finetune(struct phy_device *phydev)
738
784
__phy_write (phydev , 0x10 , 0x8ec0 );
739
785
phy_restore_page (phydev , MTK_PHY_PAGE_STANDARD , 0 );
740
786
741
- /* TR_OPEN_LOOP_EN = 1, lpf_x_average = 9*/
787
+ /* TR_OPEN_LOOP_EN = 1, lpf_x_average = 9 */
742
788
phy_modify_mmd (phydev , MDIO_MMD_VEND1 , MTK_PHY_RG_DEV1E_REG234 ,
743
789
MTK_PHY_TR_OPEN_LOOP_EN_MASK | MTK_PHY_LPF_X_AVERAGE_MASK ,
744
790
BIT (0 ) | FIELD_PREP (MTK_PHY_LPF_X_AVERAGE_MASK , 0x9 ));
@@ -771,48 +817,6 @@ static void mt798x_phy_common_finetune(struct phy_device *phydev)
771
817
phy_write_mmd (phydev , MDIO_MMD_VEND1 , MTK_PHY_LDO_OUTPUT_V , 0x2222 );
772
818
}
773
819
774
- static void mt7981_phy_finetune (struct phy_device * phydev )
775
- {
776
- u16 val [8 ] = { 0x01ce , 0x01c1 ,
777
- 0x020f , 0x0202 ,
778
- 0x03d0 , 0x03c0 ,
779
- 0x0013 , 0x0005 };
780
- int i , k ;
781
-
782
- /* 100M eye finetune:
783
- * Keep middle level of TX MLT3 shapper as default.
784
- * Only change TX MLT3 overshoot level here.
785
- */
786
- for (k = 0 , i = 1 ; i < 12 ; i ++ ) {
787
- if (i % 3 == 0 )
788
- continue ;
789
- phy_write_mmd (phydev , MDIO_MMD_VEND1 , i , val [k ++ ]);
790
- }
791
-
792
- phy_select_page (phydev , MTK_PHY_PAGE_EXTENDED_52B5 );
793
- /* SlvDSPreadyTime = 24, MasDSPreadyTime = 24 */
794
- __phy_write (phydev , 0x11 , 0xc71 );
795
- __phy_write (phydev , 0x12 , 0xc );
796
- __phy_write (phydev , 0x10 , 0x8fae );
797
-
798
- /* ResetSyncOffset = 6 */
799
- __phy_write (phydev , 0x11 , 0x600 );
800
- __phy_write (phydev , 0x12 , 0x0 );
801
- __phy_write (phydev , 0x10 , 0x8fc0 );
802
-
803
- /* VgaDecRate = 1 */
804
- __phy_write (phydev , 0x11 , 0x4c2a );
805
- __phy_write (phydev , 0x12 , 0x3e );
806
- __phy_write (phydev , 0x10 , 0x8fa4 );
807
-
808
- /* FfeUpdGainForce = 4 */
809
- __phy_write (phydev , 0x11 , 0x240 );
810
- __phy_write (phydev , 0x12 , 0x0 );
811
- __phy_write (phydev , 0x10 , 0x9680 );
812
-
813
- phy_restore_page (phydev , MTK_PHY_PAGE_STANDARD , 0 );
814
- }
815
-
816
820
static void mt7988_phy_finetune (struct phy_device * phydev )
817
821
{
818
822
u16 val [12 ] = { 0x0187 , 0x01cd , 0x01c8 , 0x0182 ,
@@ -827,31 +831,35 @@ static void mt7988_phy_finetune(struct phy_device *phydev)
827
831
/* TCT finetune */
828
832
phy_write_mmd (phydev , MDIO_MMD_VEND1 , MTK_PHY_RG_TX_FILTER , 0x5 );
829
833
830
- /* Disable TX power saving */
831
- phy_modify_mmd (phydev , MDIO_MMD_VEND1 , MTK_PHY_RXADC_CTRL_RG7 ,
832
- MTK_PHY_DA_AD_BUF_BIAS_LP_MASK , 0x3 << 8 );
833
-
834
834
phy_select_page (phydev , MTK_PHY_PAGE_EXTENDED_52B5 );
835
-
836
- /* SlvDSPreadyTime = 24, MasDSPreadyTime = 12 */
837
- __phy_write (phydev , 0x11 , 0x671 );
838
- __phy_write (phydev , 0x12 , 0xc );
839
- __phy_write (phydev , 0x10 , 0x8fae );
840
-
841
835
/* ResetSyncOffset = 5 */
842
836
__phy_write (phydev , 0x11 , 0x500 );
843
837
__phy_write (phydev , 0x12 , 0x0 );
844
838
__phy_write (phydev , 0x10 , 0x8fc0 );
845
839
846
840
/* VgaDecRate is 1 at default on mt7988 */
847
841
848
- phy_restore_page (phydev , MTK_PHY_PAGE_STANDARD , 0 );
842
+ /* MrvlTrFix100Kp = 6, MrvlTrFix100Kf = 7,
843
+ * MrvlTrFix1000Kp = 6, MrvlTrFix1000Kf = 7
844
+ */
845
+ __phy_write (phydev , 0x11 , 0xb90a );
846
+ __phy_write (phydev , 0x12 , 0x6f );
847
+ __phy_write (phydev , 0x10 , 0x8f82 );
848
+
849
+ /* RemAckCntLimitCtrl = 1 */
850
+ __phy_write (phydev , 0x11 , 0xfbba );
851
+ __phy_write (phydev , 0x12 , 0xc3 );
852
+ __phy_write (phydev , 0x10 , 0x87f8 );
849
853
850
- phy_select_page (phydev , MTK_PHY_PAGE_EXTENDED_2A30 );
851
- /* TxClkOffset = 2 */
852
- __phy_modify (phydev , MTK_PHY_ANARG_RG , MTK_PHY_TCLKOFFSET_MASK ,
853
- FIELD_PREP (MTK_PHY_TCLKOFFSET_MASK , 0x2 ));
854
854
phy_restore_page (phydev , MTK_PHY_PAGE_STANDARD , 0 );
855
+
856
+ /* TR_OPEN_LOOP_EN = 1, lpf_x_average = 10 */
857
+ phy_modify_mmd (phydev , MDIO_MMD_VEND1 , MTK_PHY_RG_DEV1E_REG234 ,
858
+ MTK_PHY_TR_OPEN_LOOP_EN_MASK | MTK_PHY_LPF_X_AVERAGE_MASK ,
859
+ BIT (0 ) | FIELD_PREP (MTK_PHY_LPF_X_AVERAGE_MASK , 0xa ));
860
+
861
+ /* rg_tr_lpf_cnt_val = 1023 */
862
+ phy_write_mmd (phydev , MDIO_MMD_VEND1 , MTK_PHY_RG_LPF_CNT_VAL , 0x3ff );
855
863
}
856
864
857
865
static void mt798x_phy_eee (struct phy_device * phydev )
@@ -884,11 +892,11 @@ static void mt798x_phy_eee(struct phy_device *phydev)
884
892
MTK_PHY_LPI_SLV_SEND_TX_EN ,
885
893
FIELD_PREP (MTK_PHY_LPI_SLV_SEND_TX_TIMER_MASK , 0x120 ));
886
894
887
- phy_modify_mmd (phydev , MDIO_MMD_VEND1 , MTK_PHY_RG_DEV1E_REG239 ,
888
- MTK_PHY_LPI_SEND_LOC_TIMER_MASK |
889
- MTK_PHY_LPI_TXPCS_LOC_RCV ,
890
- FIELD_PREP (MTK_PHY_LPI_SEND_LOC_TIMER_MASK , 0x117 ));
895
+ /* Keep MTK_PHY_LPI_SEND_LOC_TIMER as 375 */
896
+ phy_clear_bits_mmd (phydev , MDIO_MMD_VEND1 , MTK_PHY_RG_DEV1E_REG239 ,
897
+ MTK_PHY_LPI_TXPCS_LOC_RCV );
891
898
899
+ /* This also fixes some IoT issues, such as CH340 */
892
900
phy_modify_mmd (phydev , MDIO_MMD_VEND1 , MTK_PHY_RG_DEV1E_REG2C7 ,
893
901
MTK_PHY_MAX_GAIN_MASK | MTK_PHY_MIN_GAIN_MASK ,
894
902
FIELD_PREP (MTK_PHY_MAX_GAIN_MASK , 0x8 ) |
@@ -922,7 +930,7 @@ static void mt798x_phy_eee(struct phy_device *phydev)
922
930
__phy_write (phydev , 0x12 , 0x0 );
923
931
__phy_write (phydev , 0x10 , 0x9690 );
924
932
925
- /* REG_EEE_st2TrKf1000 = 3 */
933
+ /* REG_EEE_st2TrKf1000 = 2 */
926
934
__phy_write (phydev , 0x11 , 0x114f );
927
935
__phy_write (phydev , 0x12 , 0x2 );
928
936
__phy_write (phydev , 0x10 , 0x969a );
@@ -947,7 +955,7 @@ static void mt798x_phy_eee(struct phy_device *phydev)
947
955
__phy_write (phydev , 0x12 , 0x0 );
948
956
__phy_write (phydev , 0x10 , 0x96b8 );
949
957
950
- /* REGEEE_wake_slv_tr_wait_dfesigdet_en = 1 */
958
+ /* REGEEE_wake_slv_tr_wait_dfesigdet_en = 0 */
951
959
__phy_write (phydev , 0x11 , 0x1463 );
952
960
__phy_write (phydev , 0x12 , 0x0 );
953
961
__phy_write (phydev , 0x10 , 0x96ca );
@@ -1459,6 +1467,13 @@ static int mt7988_phy_probe(struct phy_device *phydev)
1459
1467
if (err )
1460
1468
return err ;
1461
1469
1470
+ /* Disable TX power saving at probing to:
1471
+ * 1. Meet common mode compliance test criteria
1472
+ * 2. Make sure that TX-VCM calibration works fine
1473
+ */
1474
+ phy_modify_mmd (phydev , MDIO_MMD_VEND1 , MTK_PHY_RXADC_CTRL_RG7 ,
1475
+ MTK_PHY_DA_AD_BUF_BIAS_LP_MASK , 0x3 << 8 );
1476
+
1462
1477
return mt798x_phy_calibration (phydev );
1463
1478
}
1464
1479
0 commit comments