Commit 8d78b690 authored by Jan Kiszka's avatar Jan Kiszka Committed by David S. Miller

stmmac: pci: Use dmi_system_id table for retrieving PHY addresses

Avoids reimplementation of DMI matching in stmmac_pci_find_phy_addr.
Signed-off-by: default avatarJan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7bc519b3
...@@ -30,36 +30,39 @@ ...@@ -30,36 +30,39 @@
* negative value of the address means that MAC controller is not connected * negative value of the address means that MAC controller is not connected
* with PHY. * with PHY.
*/ */
struct stmmac_pci_dmi_data { struct stmmac_pci_func_data {
const char *name;
const char *asset_tag;
unsigned int func; unsigned int func;
int phy_addr; int phy_addr;
}; };
struct stmmac_pci_dmi_data {
const struct stmmac_pci_func_data *func;
size_t nfuncs;
};
struct stmmac_pci_info { struct stmmac_pci_info {
int (*setup)(struct pci_dev *pdev, struct plat_stmmacenet_data *plat); int (*setup)(struct pci_dev *pdev, struct plat_stmmacenet_data *plat);
}; };
static int stmmac_pci_find_phy_addr(struct pci_dev *pdev, 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 struct stmmac_pci_func_data *func_data;
const char *asset_tag = dmi_get_system_info(DMI_BOARD_ASSET_TAG); const struct stmmac_pci_dmi_data *dmi_data;
unsigned int func = PCI_FUNC(pdev->devfn); const struct dmi_system_id *dmi_id;
struct stmmac_pci_dmi_data *dmi; int func = PCI_FUNC(pdev->devfn);
size_t n;
if (!name)
dmi_id = dmi_first_match(dmi_list);
if (!dmi_id)
return -ENODEV; return -ENODEV;
for (dmi = dmi_data; dmi->name && *dmi->name; dmi++) { dmi_data = dmi_id->driver_data;
if (!strcmp(dmi->name, name) && dmi->func == func) { func_data = dmi_data->func;
/* If asset tag is provided, match on it as well. */
if (dmi->asset_tag && strcmp(dmi->asset_tag, asset_tag)) for (n = 0; n < dmi_data->nfuncs; n++, func_data++)
continue; if (func_data->func == func)
return dmi->phy_addr; return func_data->phy_addr;
}
}
return -ENODEV; return -ENODEV;
} }
...@@ -115,34 +118,62 @@ static const struct stmmac_pci_info stmmac_pci_info = { ...@@ -115,34 +118,62 @@ static const struct stmmac_pci_info stmmac_pci_info = {
.setup = stmmac_default_data, .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, .func = 6,
.phy_addr = 1, .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, .func = 6,
.phy_addr = 1, .phy_addr = 1,
}, },
{ {
.name = "SIMATIC IOT2000", .func = 7,
.asset_tag = "6ES7647-0AA00-0YA2",
.func = 6,
.phy_addr = 1, .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", .matches = {
.asset_tag = "6ES7647-0AA00-1YA2", DMI_EXACT_MATCH(DMI_BOARD_NAME, "Galileo"),
.func = 6, },
.phy_addr = 1, .driver_data = (void *)&galileo_stmmac_dmi_data,
}, },
{ {
.name = "SIMATIC IOT2000", .matches = {
.asset_tag = "6ES7647-0AA00-1YA2", DMI_EXACT_MATCH(DMI_BOARD_NAME, "GalileoGen2"),
.func = 7, },
.phy_addr = 1, .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, ...@@ -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 * Refuse to load the driver and register net device if MAC controller
* does not connect to any PHY interface. * 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) { if (ret < 0) {
/* Return error to the caller on DMI enabled boards. */ /* Return error to the caller on DMI enabled boards. */
if (dmi_get_system_info(DMI_BOARD_NAME)) if (dmi_get_system_info(DMI_BOARD_NAME))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment