r8169: create function pointer array for PHY init functions
authorHeiner Kallweit <hkallweit1@gmail.com>
Sun, 14 Apr 2019 08:30:24 +0000 (10:30 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 14 Apr 2019 20:50:05 +0000 (13:50 -0700)
Using a function pointer array makes this easier to read and better
maintainable. AFAIK function pointer arrays cause some performance
drawback due to Spectre mitigation, but we're not in a hot path here.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/realtek/r8169.c

index 77ecf077faaf08eee99e51248638bb5bdc7c0042..0efe17b2021484785ba5eed5efb6c7edaef8dd15 100644 (file)
@@ -699,6 +699,8 @@ struct rtl8169_private {
        u32 ocp_base;
 };
 
+typedef void (*rtl_generic_fct)(struct rtl8169_private *tp);
+
 MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
 MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
 module_param_named(debug, debug.msg_enable, int, 0);
@@ -3988,131 +3990,65 @@ static void rtl8106e_hw_phy_config(struct rtl8169_private *tp)
 
 static void rtl_hw_phy_config(struct net_device *dev)
 {
+       static const rtl_generic_fct phy_configs[] = {
+               /* PCI devices. */
+               [RTL_GIGA_MAC_VER_01] = NULL,
+               [RTL_GIGA_MAC_VER_02] = rtl8169s_hw_phy_config,
+               [RTL_GIGA_MAC_VER_03] = rtl8169s_hw_phy_config,
+               [RTL_GIGA_MAC_VER_04] = rtl8169sb_hw_phy_config,
+               [RTL_GIGA_MAC_VER_05] = rtl8169scd_hw_phy_config,
+               [RTL_GIGA_MAC_VER_06] = rtl8169sce_hw_phy_config,
+               /* PCI-E devices. */
+               [RTL_GIGA_MAC_VER_07] = rtl8102e_hw_phy_config,
+               [RTL_GIGA_MAC_VER_08] = rtl8102e_hw_phy_config,
+               [RTL_GIGA_MAC_VER_09] = rtl8102e_hw_phy_config,
+               [RTL_GIGA_MAC_VER_10] = NULL,
+               [RTL_GIGA_MAC_VER_11] = rtl8168bb_hw_phy_config,
+               [RTL_GIGA_MAC_VER_12] = rtl8168bef_hw_phy_config,
+               [RTL_GIGA_MAC_VER_13] = NULL,
+               [RTL_GIGA_MAC_VER_14] = NULL,
+               [RTL_GIGA_MAC_VER_15] = NULL,
+               [RTL_GIGA_MAC_VER_16] = NULL,
+               [RTL_GIGA_MAC_VER_17] = rtl8168bef_hw_phy_config,
+               [RTL_GIGA_MAC_VER_18] = rtl8168cp_1_hw_phy_config,
+               [RTL_GIGA_MAC_VER_19] = rtl8168c_1_hw_phy_config,
+               [RTL_GIGA_MAC_VER_20] = rtl8168c_2_hw_phy_config,
+               [RTL_GIGA_MAC_VER_21] = rtl8168c_3_hw_phy_config,
+               [RTL_GIGA_MAC_VER_22] = rtl8168c_4_hw_phy_config,
+               [RTL_GIGA_MAC_VER_23] = rtl8168cp_2_hw_phy_config,
+               [RTL_GIGA_MAC_VER_24] = rtl8168cp_2_hw_phy_config,
+               [RTL_GIGA_MAC_VER_25] = rtl8168d_1_hw_phy_config,
+               [RTL_GIGA_MAC_VER_26] = rtl8168d_2_hw_phy_config,
+               [RTL_GIGA_MAC_VER_27] = rtl8168d_3_hw_phy_config,
+               [RTL_GIGA_MAC_VER_28] = rtl8168d_4_hw_phy_config,
+               [RTL_GIGA_MAC_VER_29] = rtl8105e_hw_phy_config,
+               [RTL_GIGA_MAC_VER_30] = rtl8105e_hw_phy_config,
+               [RTL_GIGA_MAC_VER_31] = NULL,
+               [RTL_GIGA_MAC_VER_32] = rtl8168e_1_hw_phy_config,
+               [RTL_GIGA_MAC_VER_33] = rtl8168e_1_hw_phy_config,
+               [RTL_GIGA_MAC_VER_34] = rtl8168e_2_hw_phy_config,
+               [RTL_GIGA_MAC_VER_35] = rtl8168f_1_hw_phy_config,
+               [RTL_GIGA_MAC_VER_36] = rtl8168f_2_hw_phy_config,
+               [RTL_GIGA_MAC_VER_37] = rtl8402_hw_phy_config,
+               [RTL_GIGA_MAC_VER_38] = rtl8411_hw_phy_config,
+               [RTL_GIGA_MAC_VER_39] = rtl8106e_hw_phy_config,
+               [RTL_GIGA_MAC_VER_40] = rtl8168g_1_hw_phy_config,
+               [RTL_GIGA_MAC_VER_41] = NULL,
+               [RTL_GIGA_MAC_VER_42] = rtl8168g_2_hw_phy_config,
+               [RTL_GIGA_MAC_VER_43] = rtl8168g_2_hw_phy_config,
+               [RTL_GIGA_MAC_VER_44] = rtl8168g_2_hw_phy_config,
+               [RTL_GIGA_MAC_VER_45] = rtl8168h_1_hw_phy_config,
+               [RTL_GIGA_MAC_VER_46] = rtl8168h_2_hw_phy_config,
+               [RTL_GIGA_MAC_VER_47] = rtl8168h_1_hw_phy_config,
+               [RTL_GIGA_MAC_VER_48] = rtl8168h_2_hw_phy_config,
+               [RTL_GIGA_MAC_VER_49] = rtl8168ep_1_hw_phy_config,
+               [RTL_GIGA_MAC_VER_50] = rtl8168ep_2_hw_phy_config,
+               [RTL_GIGA_MAC_VER_51] = rtl8168ep_2_hw_phy_config,
+       };
        struct rtl8169_private *tp = netdev_priv(dev);
 
-       switch (tp->mac_version) {
-       case RTL_GIGA_MAC_VER_01:
-               break;
-       case RTL_GIGA_MAC_VER_02:
-       case RTL_GIGA_MAC_VER_03:
-               rtl8169s_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_04:
-               rtl8169sb_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_05:
-               rtl8169scd_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_06:
-               rtl8169sce_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_07:
-       case RTL_GIGA_MAC_VER_08:
-       case RTL_GIGA_MAC_VER_09:
-               rtl8102e_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_11:
-               rtl8168bb_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_12:
-               rtl8168bef_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_17:
-               rtl8168bef_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_18:
-               rtl8168cp_1_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_19:
-               rtl8168c_1_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_20:
-               rtl8168c_2_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_21:
-               rtl8168c_3_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_22:
-               rtl8168c_4_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_23:
-       case RTL_GIGA_MAC_VER_24:
-               rtl8168cp_2_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_25:
-               rtl8168d_1_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_26:
-               rtl8168d_2_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_27:
-               rtl8168d_3_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_28:
-               rtl8168d_4_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_29:
-       case RTL_GIGA_MAC_VER_30:
-               rtl8105e_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_31:
-               /* None. */
-               break;
-       case RTL_GIGA_MAC_VER_32:
-       case RTL_GIGA_MAC_VER_33:
-               rtl8168e_1_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_34:
-               rtl8168e_2_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_35:
-               rtl8168f_1_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_36:
-               rtl8168f_2_hw_phy_config(tp);
-               break;
-
-       case RTL_GIGA_MAC_VER_37:
-               rtl8402_hw_phy_config(tp);
-               break;
-
-       case RTL_GIGA_MAC_VER_38:
-               rtl8411_hw_phy_config(tp);
-               break;
-
-       case RTL_GIGA_MAC_VER_39:
-               rtl8106e_hw_phy_config(tp);
-               break;
-
-       case RTL_GIGA_MAC_VER_40:
-               rtl8168g_1_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_42:
-       case RTL_GIGA_MAC_VER_43:
-       case RTL_GIGA_MAC_VER_44:
-               rtl8168g_2_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_45:
-       case RTL_GIGA_MAC_VER_47:
-               rtl8168h_1_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_46:
-       case RTL_GIGA_MAC_VER_48:
-               rtl8168h_2_hw_phy_config(tp);
-               break;
-
-       case RTL_GIGA_MAC_VER_49:
-               rtl8168ep_1_hw_phy_config(tp);
-               break;
-       case RTL_GIGA_MAC_VER_50:
-       case RTL_GIGA_MAC_VER_51:
-               rtl8168ep_2_hw_phy_config(tp);
-               break;
-
-       case RTL_GIGA_MAC_VER_41:
-       default:
-               break;
-       }
+       if (phy_configs[tp->mac_version])
+               phy_configs[tp->mac_version](tp);
 }
 
 static void rtl_schedule_task(struct rtl8169_private *tp, enum rtl_flag flag)