Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+64 −33
Original line number Original line Diff line number Diff line
@@ -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 = {
	.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,
	 * 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))