OSDN Git Service

r8169: improve rtl8169_get_mac_version
authorHeiner Kallweit <hkallweit1@gmail.com>
Sat, 15 Feb 2020 13:52:05 +0000 (14:52 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 17 Feb 2020 03:36:06 +0000 (19:36 -0800)
Currently code snippet (RTL_R32(tp, TxConfig) >> 20) & 0xfcf is used
in few places to extract the chip XID. Change the code to do the XID
extraction only once.

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

index 46e8e3d..25b0cae 100644 (file)
@@ -2045,7 +2045,7 @@ static void rtl_enable_eee(struct rtl8169_private *tp)
                phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv);
 }
 
-static void rtl8169_get_mac_version(struct rtl8169_private *tp)
+static enum mac_version rtl8169_get_mac_version(u16 xid, bool gmii)
 {
        /*
         * The driver currently handles the 8168Bf and the 8168Be identically
@@ -2061,7 +2061,7 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp)
        static const struct rtl_mac_info {
                u16 mask;
                u16 val;
-               u16 mac_version;
+               enum mac_version ver;
        } mac_info[] = {
                /* 8125 family. */
                { 0x7cf, 0x608, RTL_GIGA_MAC_VER_60 },
@@ -2148,22 +2148,22 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp)
                { 0x000, 0x000, RTL_GIGA_MAC_NONE   }
        };
        const struct rtl_mac_info *p = mac_info;
-       u16 reg = RTL_R32(tp, TxConfig) >> 20;
+       enum mac_version ver;
 
-       while ((reg & p->mask) != p->val)
+       while ((xid & p->mask) != p->val)
                p++;
-       tp->mac_version = p->mac_version;
-
-       if (tp->mac_version == RTL_GIGA_MAC_NONE) {
-               dev_err(tp_to_dev(tp), "unknown chip XID %03x\n", reg & 0xfcf);
-       } else if (!tp->supports_gmii) {
-               if (tp->mac_version == RTL_GIGA_MAC_VER_42)
-                       tp->mac_version = RTL_GIGA_MAC_VER_43;
-               else if (tp->mac_version == RTL_GIGA_MAC_VER_45)
-                       tp->mac_version = RTL_GIGA_MAC_VER_47;
-               else if (tp->mac_version == RTL_GIGA_MAC_VER_46)
-                       tp->mac_version = RTL_GIGA_MAC_VER_48;
+       ver = p->ver;
+
+       if (ver != RTL_GIGA_MAC_NONE && !gmii) {
+               if (ver == RTL_GIGA_MAC_VER_42)
+                       ver = RTL_GIGA_MAC_VER_43;
+               else if (ver == RTL_GIGA_MAC_VER_45)
+                       ver = RTL_GIGA_MAC_VER_47;
+               else if (ver == RTL_GIGA_MAC_VER_46)
+                       ver = RTL_GIGA_MAC_VER_48;
        }
+
+       return ver;
 }
 
 static void rtl_release_firmware(struct rtl8169_private *tp)
@@ -5440,9 +5440,10 @@ done:
 static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        struct rtl8169_private *tp;
+       int jumbo_max, region, rc;
+       enum mac_version chipset;
        struct net_device *dev;
-       int chipset, region;
-       int jumbo_max, rc;
+       u16 xid;
 
        /* Some tools for creating an initramfs don't consider softdeps, then
         * r8169.ko may be in initramfs, but realtek.ko not. Then the generic
@@ -5509,10 +5510,16 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        tp->mmio_addr = pcim_iomap_table(pdev)[region];
 
+       xid = (RTL_R32(tp, TxConfig) >> 20) & 0xfcf;
+
        /* Identify chip attached to board */
-       rtl8169_get_mac_version(tp);
-       if (tp->mac_version == RTL_GIGA_MAC_NONE)
+       chipset = rtl8169_get_mac_version(xid, tp->supports_gmii);
+       if (chipset == RTL_GIGA_MAC_NONE) {
+               dev_err(&pdev->dev, "unknown chip XID %03x\n", xid);
                return -ENODEV;
+       }
+
+       tp->mac_version = chipset;
 
        tp->cp_cmd = RTL_R16(tp, CPlusCmd);
 
@@ -5530,8 +5537,6 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        pci_set_master(pdev);
 
-       chipset = tp->mac_version;
-
        rc = rtl_alloc_irq(tp);
        if (rc < 0) {
                dev_err(&pdev->dev, "Can't allocate interrupt\n");
@@ -5619,8 +5624,7 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto err_mdio_unregister;
 
        netif_info(tp, probe, dev, "%s, %pM, XID %03x, IRQ %d\n",
-                  rtl_chip_infos[chipset].name, dev->dev_addr,
-                  (RTL_R32(tp, TxConfig) >> 20) & 0xfcf,
+                  rtl_chip_infos[chipset].name, dev->dev_addr, xid,
                   pci_irq_vector(pdev, 0));
 
        if (jumbo_max)