Commit 6ed34721 authored by Tristram Ha's avatar Tristram Ha Committed by Jakub Kicinski
Browse files

net: dsa: microchip: Do not execute PTP driver code for unsupported switches



The PTP driver code only works for certain KSZ switches like KSZ9477,
KSZ9567, LAN937X and their varieties.  This code is enabled by kernel
configuration CONFIG_NET_DSA_MICROCHIP_KSZ_PTP.  As the DSA driver is
common to work with all KSZ switches this PTP code is not appropriate
for other unsupported switches.  The ptp_capable indication is added to
the chip data structure to signal whether to execute those code.

Signed-off-by: default avatarTristram Ha <tristram.ha@microchip.com>
Link: https://patch.msgid.link/20241218020240.70601-1-Tristram.Ha@microchip.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 32720407
Loading
Loading
Loading
Loading
+29 −11
Original line number Diff line number Diff line
@@ -1339,6 +1339,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
		.supports_rgmii = {false, false, true},
		.internal_phy = {true, true, false},
		.gbit_capable = {false, false, true},
		.ptp_capable = true,
		.wr_table = &ksz8563_register_set,
		.rd_table = &ksz8563_register_set,
	},
@@ -1550,6 +1551,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
		.internal_phy	= {true, true, true, true,
				   true, false, false},
		.gbit_capable	= {true, true, true, true, true, true, true},
		.ptp_capable = true,
		.wr_table = &ksz9477_register_set,
		.rd_table = &ksz9477_register_set,
	},
@@ -1677,6 +1679,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
		.supports_rgmii = {false, false, true},
		.internal_phy = {true, true, false},
		.gbit_capable = {true, true, true},
		.ptp_capable = true,
	},

	[KSZ8567] = {
@@ -1712,6 +1715,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
				   true, false, false},
		.gbit_capable	= {false, false, false, false, false,
				   true, true},
		.ptp_capable = true,
	},

	[KSZ9567] = {
@@ -1744,6 +1748,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
		.internal_phy	= {true, true, true, true,
				   true, false, false},
		.gbit_capable	= {true, true, true, true, true, true, true},
		.ptp_capable = true,
	},

	[LAN9370] = {
@@ -1773,6 +1778,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
		.supports_rmii = {false, false, false, false, true},
		.supports_rgmii = {false, false, false, false, true},
		.internal_phy = {true, true, true, true, false},
		.ptp_capable = true,
	},

	[LAN9371] = {
@@ -1802,6 +1808,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
		.supports_rmii = {false, false, false, false, true, true},
		.supports_rgmii = {false, false, false, false, true, true},
		.internal_phy = {true, true, true, true, false, false},
		.ptp_capable = true,
	},

	[LAN9372] = {
@@ -1835,6 +1842,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
				   true, true, false, false},
		.internal_phy	= {true, true, true, true,
				   false, false, true, true},
		.ptp_capable = true,
	},

	[LAN9373] = {
@@ -1868,6 +1876,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
				   true, true, false, false},
		.internal_phy	= {true, true, true, false,
				   false, false, true, true},
		.ptp_capable = true,
	},

	[LAN9374] = {
@@ -1901,6 +1910,7 @@ const struct ksz_chip_data ksz_switch_chips[] = {
				   true, true, false, false},
		.internal_phy	= {true, true, true, true,
				   false, false, true, true},
		.ptp_capable = true,
	},

	[LAN9646] = {
@@ -2809,17 +2819,22 @@ static int ksz_setup(struct dsa_switch *ds)
			if (ret)
				goto out_girq;

			if (dev->info->ptp_capable) {
				ret = ksz_ptp_irq_setup(ds, dp->index);
				if (ret)
					goto out_pirq;
			}
		}
	}

	if (dev->info->ptp_capable) {
		ret = ksz_ptp_clock_register(ds);
		if (ret) {
		dev_err(dev->dev, "Failed to register PTP clock: %d\n", ret);
			dev_err(dev->dev, "Failed to register PTP clock: %d\n",
				ret);
			goto out_ptpirq;
		}
	}

	ret = ksz_mdio_register(dev);
	if (ret < 0) {
@@ -2838,9 +2853,10 @@ static int ksz_setup(struct dsa_switch *ds)
	return 0;

out_ptp_clock_unregister:
	if (dev->info->ptp_capable)
		ksz_ptp_clock_unregister(ds);
out_ptpirq:
	if (dev->irq > 0)
	if (dev->irq > 0 && dev->info->ptp_capable)
		dsa_switch_for_each_user_port(dp, dev->ds)
			ksz_ptp_irq_free(ds, dp->index);
out_pirq:
@@ -2859,10 +2875,12 @@ static void ksz_teardown(struct dsa_switch *ds)
	struct ksz_device *dev = ds->priv;
	struct dsa_port *dp;

	if (dev->info->ptp_capable)
		ksz_ptp_clock_unregister(ds);

	if (dev->irq > 0) {
		dsa_switch_for_each_user_port(dp, dev->ds) {
			if (dev->info->ptp_capable)
				ksz_ptp_irq_free(ds, dp->index);

			ksz_irq_free(&dev->ports[dp->index].pirq);
+1 −0
Original line number Diff line number Diff line
@@ -92,6 +92,7 @@ struct ksz_chip_data {
	bool supports_rgmii[KSZ_MAX_NUM_PORTS];
	bool internal_phy[KSZ_MAX_NUM_PORTS];
	bool gbit_capable[KSZ_MAX_NUM_PORTS];
	bool ptp_capable;
	const struct regmap_access_table *wr_table;
	const struct regmap_access_table *rd_table;
};