@@ -1022,12 +1022,52 @@ static void hns_dsaf_tbl_tcam_init(struct dsaf_device *dsaf_dev)
10221022 * @mac_cb: mac contrl block
10231023 */
10241024static void hns_dsaf_pfc_en_cfg (struct dsaf_device * dsaf_dev ,
1025- int mac_id , int en )
1025+ int mac_id , int tc_en )
10261026{
1027- if (!en )
1028- dsaf_write_dev (dsaf_dev , DSAF_PFC_EN_0_REG + mac_id * 4 , 0 );
1027+ dsaf_write_dev (dsaf_dev , DSAF_PFC_EN_0_REG + mac_id * 4 , tc_en );
1028+ }
1029+
1030+ static void hns_dsaf_set_pfc_pause (struct dsaf_device * dsaf_dev ,
1031+ int mac_id , int tx_en , int rx_en )
1032+ {
1033+ if (AE_IS_VER1 (dsaf_dev -> dsaf_ver )) {
1034+ if (!tx_en || !rx_en )
1035+ dev_err (dsaf_dev -> dev , "dsaf v1 can not close pfc!\n" );
1036+
1037+ return ;
1038+ }
1039+
1040+ dsaf_set_dev_bit (dsaf_dev , DSAF_PAUSE_CFG_REG + mac_id * 4 ,
1041+ DSAF_PFC_PAUSE_RX_EN_B , !!rx_en );
1042+ dsaf_set_dev_bit (dsaf_dev , DSAF_PAUSE_CFG_REG + mac_id * 4 ,
1043+ DSAF_PFC_PAUSE_TX_EN_B , !!tx_en );
1044+ }
1045+
1046+ int hns_dsaf_set_rx_mac_pause_en (struct dsaf_device * dsaf_dev , int mac_id ,
1047+ u32 en )
1048+ {
1049+ if (AE_IS_VER1 (dsaf_dev -> dsaf_ver )) {
1050+ if (!en )
1051+ dev_err (dsaf_dev -> dev , "dsafv1 can't close rx_pause!\n" );
1052+
1053+ return - EINVAL ;
1054+ }
1055+
1056+ dsaf_set_dev_bit (dsaf_dev , DSAF_PAUSE_CFG_REG + mac_id * 4 ,
1057+ DSAF_MAC_PAUSE_RX_EN_B , !!en );
1058+
1059+ return 0 ;
1060+ }
1061+
1062+ void hns_dsaf_get_rx_mac_pause_en (struct dsaf_device * dsaf_dev , int mac_id ,
1063+ u32 * en )
1064+ {
1065+ if (AE_IS_VER1 (dsaf_dev -> dsaf_ver ))
1066+ * en = 1 ;
10291067 else
1030- dsaf_write_dev (dsaf_dev , DSAF_PFC_EN_0_REG + mac_id * 4 , 0xff );
1068+ * en = dsaf_get_dev_bit (dsaf_dev ,
1069+ DSAF_PAUSE_CFG_REG + mac_id * 4 ,
1070+ DSAF_MAC_PAUSE_RX_EN_B );
10311071}
10321072
10331073/**
@@ -1039,6 +1079,7 @@ static void hns_dsaf_comm_init(struct dsaf_device *dsaf_dev)
10391079{
10401080 u32 i ;
10411081 u32 o_dsaf_cfg ;
1082+ bool is_ver1 = AE_IS_VER1 (dsaf_dev -> dsaf_ver );
10421083
10431084 o_dsaf_cfg = dsaf_read_dev (dsaf_dev , DSAF_CFG_0_REG );
10441085 dsaf_set_bit (o_dsaf_cfg , DSAF_CFG_EN_S , dsaf_dev -> dsaf_en );
@@ -1064,8 +1105,10 @@ static void hns_dsaf_comm_init(struct dsaf_device *dsaf_dev)
10641105 hns_dsaf_sw_port_type_cfg (dsaf_dev , DSAF_SW_PORT_TYPE_NON_VLAN );
10651106
10661107 /*set dsaf pfc to 0 for parseing rx pause*/
1067- for (i = 0 ; i < DSAF_COMM_CHN ; i ++ )
1108+ for (i = 0 ; i < DSAF_COMM_CHN ; i ++ ) {
10681109 hns_dsaf_pfc_en_cfg (dsaf_dev , i , 0 );
1110+ hns_dsaf_set_pfc_pause (dsaf_dev , i , is_ver1 , is_ver1 );
1111+ }
10691112
10701113 /*msk and clr exception irqs */
10711114 for (i = 0 ; i < DSAF_COMM_CHN ; i ++ ) {
@@ -2013,6 +2056,8 @@ void hns_dsaf_update_stats(struct dsaf_device *dsaf_dev, u32 node_num)
20132056{
20142057 struct dsaf_hw_stats * hw_stats
20152058 = & dsaf_dev -> hw_stats [node_num ];
2059+ bool is_ver1 = AE_IS_VER1 (dsaf_dev -> dsaf_ver );
2060+ u32 reg_tmp ;
20162061
20172062 hw_stats -> pad_drop += dsaf_read_dev (dsaf_dev ,
20182063 DSAF_INODE_PAD_DISCARD_NUM_0_REG + 0x80 * (u64 )node_num );
@@ -2022,8 +2067,12 @@ void hns_dsaf_update_stats(struct dsaf_device *dsaf_dev, u32 node_num)
20222067 DSAF_INODE_FINAL_IN_PKT_NUM_0_REG + 0x80 * (u64 )node_num );
20232068 hw_stats -> rx_pkt_id += dsaf_read_dev (dsaf_dev ,
20242069 DSAF_INODE_SBM_PID_NUM_0_REG + 0x80 * (u64 )node_num );
2025- hw_stats -> rx_pause_frame += dsaf_read_dev (dsaf_dev ,
2026- DSAF_INODE_FINAL_IN_PAUSE_NUM_0_REG + 0x80 * (u64 )node_num );
2070+
2071+ reg_tmp = is_ver1 ? DSAF_INODE_FINAL_IN_PAUSE_NUM_0_REG :
2072+ DSAFV2_INODE_FINAL_IN_PAUSE_NUM_0_REG ;
2073+ hw_stats -> rx_pause_frame +=
2074+ dsaf_read_dev (dsaf_dev , reg_tmp + 0x80 * (u64 )node_num );
2075+
20272076 hw_stats -> release_buf_num += dsaf_read_dev (dsaf_dev ,
20282077 DSAF_INODE_SBM_RELS_NUM_0_REG + 0x80 * (u64 )node_num );
20292078 hw_stats -> sbm_drop += dsaf_read_dev (dsaf_dev ,
@@ -2056,6 +2105,8 @@ void hns_dsaf_get_regs(struct dsaf_device *ddev, u32 port, void *data)
20562105 u32 i = 0 ;
20572106 u32 j ;
20582107 u32 * p = data ;
2108+ u32 reg_tmp ;
2109+ bool is_ver1 = AE_IS_VER1 (ddev -> dsaf_ver );
20592110
20602111 /* dsaf common registers */
20612112 p [0 ] = dsaf_read_dev (ddev , DSAF_SRAM_INIT_OVER_0_REG );
@@ -2120,8 +2171,9 @@ void hns_dsaf_get_regs(struct dsaf_device *ddev, u32 port, void *data)
21202171 DSAF_INODE_FINAL_IN_PKT_NUM_0_REG + j * 0x80 );
21212172 p [190 + i ] = dsaf_read_dev (ddev ,
21222173 DSAF_INODE_SBM_PID_NUM_0_REG + j * 0x80 );
2123- p [193 + i ] = dsaf_read_dev (ddev ,
2124- DSAF_INODE_FINAL_IN_PAUSE_NUM_0_REG + j * 0x80 );
2174+ reg_tmp = is_ver1 ? DSAF_INODE_FINAL_IN_PAUSE_NUM_0_REG :
2175+ DSAFV2_INODE_FINAL_IN_PAUSE_NUM_0_REG ;
2176+ p [193 + i ] = dsaf_read_dev (ddev , reg_tmp + j * 0x80 );
21252177 p [196 + i ] = dsaf_read_dev (ddev ,
21262178 DSAF_INODE_SBM_RELS_NUM_0_REG + j * 0x80 );
21272179 p [199 + i ] = dsaf_read_dev (ddev ,
@@ -2368,8 +2420,11 @@ void hns_dsaf_get_regs(struct dsaf_device *ddev, u32 port, void *data)
23682420 p [496 ] = dsaf_read_dev (ddev , DSAF_NETPORT_CTRL_SIG_0_REG + port * 0x4 );
23692421 p [497 ] = dsaf_read_dev (ddev , DSAF_XGE_CTRL_SIG_CFG_0_REG + port * 0x4 );
23702422
2423+ if (!is_ver1 )
2424+ p [498 ] = dsaf_read_dev (ddev , DSAF_PAUSE_CFG_REG + port * 0x4 );
2425+
23712426 /* mark end of dsaf regs */
2372- for (i = 498 ; i < 504 ; i ++ )
2427+ for (i = 499 ; i < 504 ; i ++ )
23732428 p [i ] = 0xdddddddd ;
23742429}
23752430
0 commit comments