@@ -2653,11 +2653,38 @@ static u8 hclge_check_speed_dup(u8 duplex, int speed)
2653
2653
return duplex ;
2654
2654
}
2655
2655
2656
+ struct hclge_mac_speed_map hclge_mac_speed_map_to_fw [] = {
2657
+ {HCLGE_MAC_SPEED_10M , HCLGE_FW_MAC_SPEED_10M },
2658
+ {HCLGE_MAC_SPEED_100M , HCLGE_FW_MAC_SPEED_100M },
2659
+ {HCLGE_MAC_SPEED_1G , HCLGE_FW_MAC_SPEED_1G },
2660
+ {HCLGE_MAC_SPEED_10G , HCLGE_FW_MAC_SPEED_10G },
2661
+ {HCLGE_MAC_SPEED_25G , HCLGE_FW_MAC_SPEED_25G },
2662
+ {HCLGE_MAC_SPEED_40G , HCLGE_FW_MAC_SPEED_40G },
2663
+ {HCLGE_MAC_SPEED_50G , HCLGE_FW_MAC_SPEED_50G },
2664
+ {HCLGE_MAC_SPEED_100G , HCLGE_FW_MAC_SPEED_100G },
2665
+ {HCLGE_MAC_SPEED_200G , HCLGE_FW_MAC_SPEED_200G },
2666
+ };
2667
+
2668
+ static int hclge_convert_to_fw_speed (u32 speed_drv , u32 * speed_fw )
2669
+ {
2670
+ u16 i ;
2671
+
2672
+ for (i = 0 ; i < ARRAY_SIZE (hclge_mac_speed_map_to_fw ); i ++ ) {
2673
+ if (hclge_mac_speed_map_to_fw [i ].speed_drv == speed_drv ) {
2674
+ * speed_fw = hclge_mac_speed_map_to_fw [i ].speed_fw ;
2675
+ return 0 ;
2676
+ }
2677
+ }
2678
+
2679
+ return - EINVAL ;
2680
+ }
2681
+
2656
2682
static int hclge_cfg_mac_speed_dup_hw (struct hclge_dev * hdev , int speed ,
2657
2683
u8 duplex )
2658
2684
{
2659
2685
struct hclge_config_mac_speed_dup_cmd * req ;
2660
2686
struct hclge_desc desc ;
2687
+ u32 speed_fw ;
2661
2688
int ret ;
2662
2689
2663
2690
req = (struct hclge_config_mac_speed_dup_cmd * )desc .data ;
@@ -2667,48 +2694,14 @@ static int hclge_cfg_mac_speed_dup_hw(struct hclge_dev *hdev, int speed,
2667
2694
if (duplex )
2668
2695
hnae3_set_bit (req -> speed_dup , HCLGE_CFG_DUPLEX_B , 1 );
2669
2696
2670
- switch (speed ) {
2671
- case HCLGE_MAC_SPEED_10M :
2672
- hnae3_set_field (req -> speed_dup , HCLGE_CFG_SPEED_M ,
2673
- HCLGE_CFG_SPEED_S , HCLGE_FW_MAC_SPEED_10M );
2674
- break ;
2675
- case HCLGE_MAC_SPEED_100M :
2676
- hnae3_set_field (req -> speed_dup , HCLGE_CFG_SPEED_M ,
2677
- HCLGE_CFG_SPEED_S , HCLGE_FW_MAC_SPEED_100M );
2678
- break ;
2679
- case HCLGE_MAC_SPEED_1G :
2680
- hnae3_set_field (req -> speed_dup , HCLGE_CFG_SPEED_M ,
2681
- HCLGE_CFG_SPEED_S , HCLGE_FW_MAC_SPEED_1G );
2682
- break ;
2683
- case HCLGE_MAC_SPEED_10G :
2684
- hnae3_set_field (req -> speed_dup , HCLGE_CFG_SPEED_M ,
2685
- HCLGE_CFG_SPEED_S , HCLGE_FW_MAC_SPEED_10G );
2686
- break ;
2687
- case HCLGE_MAC_SPEED_25G :
2688
- hnae3_set_field (req -> speed_dup , HCLGE_CFG_SPEED_M ,
2689
- HCLGE_CFG_SPEED_S , HCLGE_FW_MAC_SPEED_25G );
2690
- break ;
2691
- case HCLGE_MAC_SPEED_40G :
2692
- hnae3_set_field (req -> speed_dup , HCLGE_CFG_SPEED_M ,
2693
- HCLGE_CFG_SPEED_S , HCLGE_FW_MAC_SPEED_40G );
2694
- break ;
2695
- case HCLGE_MAC_SPEED_50G :
2696
- hnae3_set_field (req -> speed_dup , HCLGE_CFG_SPEED_M ,
2697
- HCLGE_CFG_SPEED_S , HCLGE_FW_MAC_SPEED_50G );
2698
- break ;
2699
- case HCLGE_MAC_SPEED_100G :
2700
- hnae3_set_field (req -> speed_dup , HCLGE_CFG_SPEED_M ,
2701
- HCLGE_CFG_SPEED_S , HCLGE_FW_MAC_SPEED_100G );
2702
- break ;
2703
- case HCLGE_MAC_SPEED_200G :
2704
- hnae3_set_field (req -> speed_dup , HCLGE_CFG_SPEED_M ,
2705
- HCLGE_CFG_SPEED_S , HCLGE_FW_MAC_SPEED_200G );
2706
- break ;
2707
- default :
2697
+ ret = hclge_convert_to_fw_speed (speed , & speed_fw );
2698
+ if (ret ) {
2708
2699
dev_err (& hdev -> pdev -> dev , "invalid speed (%d)\n" , speed );
2709
- return - EINVAL ;
2700
+ return ret ;
2710
2701
}
2711
2702
2703
+ hnae3_set_field (req -> speed_dup , HCLGE_CFG_SPEED_M , HCLGE_CFG_SPEED_S ,
2704
+ speed_fw );
2712
2705
hnae3_set_bit (req -> mac_change_fec_en , HCLGE_CFG_MAC_SPEED_CHANGE_EN_B ,
2713
2706
1 );
2714
2707
0 commit comments