stmmac: pci: Use dmi_system_id table for retrieving PHY addresses
authorJan Kiszka <jan.kiszka@siemens.com>
Thu, 22 Jun 2017 06:18:01 +0000 (08:18 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 22 Jun 2017 17:39:57 +0000 (13:39 -0400)
Avoids reimplementation of DMI matching in stmmac_pci_find_phy_addr.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c

index a6e10d3ced5c5e0a8e94f2ee6596c8a1185dd795..8d375e51a5265104d515f5622696dc2e0cae1ea2 100644 (file)
  * negative value of the address means that MAC controller is not connected
  * with PHY.
  */
-struct stmmac_pci_dmi_data {
-       const char *name;
-       const char *asset_tag;
+struct stmmac_pci_func_data {
        unsigned int func;
        int phy_addr;
 };
 
+struct stmmac_pci_dmi_data {
+       const struct stmmac_pci_func_data *func;
+       size_t nfuncs;
+};
+
 struct stmmac_pci_info {
        int (*setup)(struct pci_dev *pdev, struct plat_stmmacenet_data *plat);
 };
 
 static int stmmac_pci_find_phy_addr(struct pci_dev *pdev,
-                                   struct stmmac_pci_dmi_data *dmi_data)
+                                   const struct dmi_system_id *dmi_list)
 {
-       const char *name = dmi_get_system_info(DMI_BOARD_NAME);
-       const char *asset_tag = dmi_get_system_info(DMI_BOARD_ASSET_TAG);
-       unsigned int func = PCI_FUNC(pdev->devfn);
-       struct stmmac_pci_dmi_data *dmi;
-
-       if (!name)
+       const struct stmmac_pci_func_data *func_data;
+       const struct stmmac_pci_dmi_data *dmi_data;
+       const struct dmi_system_id *dmi_id;
+       int func = PCI_FUNC(pdev->devfn);
+       size_t n;
+
+       dmi_id = dmi_first_match(dmi_list);
+       if (!dmi_id)
                return -ENODEV;
 
-       for (dmi = dmi_data; dmi->name && *dmi->name; dmi++) {
-               if (!strcmp(dmi->name, name) && dmi->func == func) {
-                       /* If asset tag is provided, match on it as well. */
-                       if (dmi->asset_tag && strcmp(dmi->asset_tag, asset_tag))
-                               continue;
-                       return dmi->phy_addr;
-               }
-       }
+       dmi_data = dmi_id->driver_data;
+       func_data = dmi_data->func;
+
+       for (n = 0; n < dmi_data->nfuncs; n++, func_data++)
+               if (func_data->func == func)
+                       return func_data->phy_addr;
 
        return -ENODEV;
 }
@@ -115,34 +118,62 @@ static const struct stmmac_pci_info stmmac_pci_info = {
        .setup = stmmac_default_data,
 };
 
-static struct stmmac_pci_dmi_data quark_pci_dmi_data[] = {
+static const struct stmmac_pci_func_data galileo_stmmac_func_data[] = {
        {
-               .name = "Galileo",
                .func = 6,
                .phy_addr = 1,
        },
+};
+
+static const struct stmmac_pci_dmi_data galileo_stmmac_dmi_data = {
+       .func = galileo_stmmac_func_data,
+       .nfuncs = ARRAY_SIZE(galileo_stmmac_func_data),
+};
+
+static const struct stmmac_pci_func_data iot2040_stmmac_func_data[] = {
        {
-               .name = "GalileoGen2",
                .func = 6,
                .phy_addr = 1,
        },
        {
-               .name = "SIMATIC IOT2000",
-               .asset_tag = "6ES7647-0AA00-0YA2",
-               .func = 6,
+               .func = 7,
                .phy_addr = 1,
        },
+};
+
+static const struct stmmac_pci_dmi_data iot2040_stmmac_dmi_data = {
+       .func = iot2040_stmmac_func_data,
+       .nfuncs = ARRAY_SIZE(iot2040_stmmac_func_data),
+};
+
+static const struct dmi_system_id quark_pci_dmi[] = {
        {
-               .name = "SIMATIC IOT2000",
-               .asset_tag = "6ES7647-0AA00-1YA2",
-               .func = 6,
-               .phy_addr = 1,
+               .matches = {
+                       DMI_EXACT_MATCH(DMI_BOARD_NAME, "Galileo"),
+               },
+               .driver_data = (void *)&galileo_stmmac_dmi_data,
        },
        {
-               .name = "SIMATIC IOT2000",
-               .asset_tag = "6ES7647-0AA00-1YA2",
-               .func = 7,
-               .phy_addr = 1,
+               .matches = {
+                       DMI_EXACT_MATCH(DMI_BOARD_NAME, "GalileoGen2"),
+               },
+               .driver_data = (void *)&galileo_stmmac_dmi_data,
+       },
+       {
+               .matches = {
+                       DMI_EXACT_MATCH(DMI_BOARD_NAME, "SIMATIC IOT2000"),
+                       DMI_EXACT_MATCH(DMI_BOARD_ASSET_TAG,
+                                       "6ES7647-0AA00-0YA2"),
+               },
+               .driver_data = (void *)&galileo_stmmac_dmi_data,
+       },
+       {
+               .matches = {
+                       DMI_EXACT_MATCH(DMI_BOARD_NAME, "SIMATIC IOT2000"),
+                       DMI_EXACT_MATCH(DMI_BOARD_ASSET_TAG,
+                                       "6ES7647-0AA00-1YA2"),
+               },
+               .driver_data = (void *)&iot2040_stmmac_dmi_data,
        },
        {}
 };
@@ -159,7 +190,7 @@ static int quark_default_data(struct pci_dev *pdev,
         * Refuse to load the driver and register net device if MAC controller
         * does not connect to any PHY interface.
         */
-       ret = stmmac_pci_find_phy_addr(pdev, quark_pci_dmi_data);
+       ret = stmmac_pci_find_phy_addr(pdev, quark_pci_dmi);
        if (ret < 0) {
                /* Return error to the caller on DMI enabled boards. */
                if (dmi_get_system_info(DMI_BOARD_NAME))