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

Commit a0ec9319 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'mediatek-hw-lro-chip-id-check'



Nelson Chang says:

====================
net: ethernet: mediatek: check the hw lro capability by the chip id instead of the dtsi

The series modify to check if hw lro is supported by the chip id.

changes since v3:
- Refine mtk_is_hwlro_supported() function

changes since v2:
- Refine mtk_get_chip_id() function

changes since v1:
- Because hw lro started to be supported from MT7623, the proper way to check if the feature is capable is to judge by the chip id instead of by the dtsi.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 0d818c28 3a09f18e
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@ Required properties:
Optional properties:
- interrupt-parent: Should be the phandle for the interrupt controller
  that services interrupts for this device
- mediatek,hwlro: the capability if the hardware supports LRO functions

* Ethernet MAC node

@@ -54,7 +53,6 @@ eth: ethernet@1b100000 {
	reset-names = "eth";
	mediatek,ethsys = <&ethsys>;
	mediatek,pctl = <&syscfg_pctl_a>;
	mediatek,hwlro;
	#address-cells = <1>;
	#size-cells = <0>;

+41 −2
Original line number Diff line number Diff line
@@ -2323,6 +2323,41 @@ static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
	return err;
}

static int mtk_get_chip_id(struct mtk_eth *eth, u32 *chip_id)
{
	u32 val[2], id[4];

	regmap_read(eth->ethsys, ETHSYS_CHIPID0_3, &val[0]);
	regmap_read(eth->ethsys, ETHSYS_CHIPID4_7, &val[1]);

	id[3] = ((val[0] >> 16) & 0xff) - '0';
	id[2] = ((val[0] >> 24) & 0xff) - '0';
	id[1] = (val[1] & 0xff) - '0';
	id[0] = ((val[1] >> 8) & 0xff) - '0';

	*chip_id = (id[3] * 1000) + (id[2] * 100) +
		   (id[1] * 10) + id[0];

	if (!(*chip_id)) {
		dev_err(eth->dev, "failed to get chip id\n");
		return -ENODEV;
	}

	dev_info(eth->dev, "chip id = %d\n", *chip_id);

	return 0;
}

static bool mtk_is_hwlro_supported(struct mtk_eth *eth)
{
	switch (eth->chip_id) {
	case MT7623_ETH:
		return true;
	}

	return false;
}

static int mtk_probe(struct platform_device *pdev)
{
	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -2362,8 +2397,6 @@ static int mtk_probe(struct platform_device *pdev)
		return PTR_ERR(eth->pctl);
	}

	eth->hwlro = of_property_read_bool(pdev->dev.of_node, "mediatek,hwlro");

	for (i = 0; i < 3; i++) {
		eth->irq[i] = platform_get_irq(pdev, i);
		if (eth->irq[i] < 0) {
@@ -2388,6 +2421,12 @@ static int mtk_probe(struct platform_device *pdev)
	if (err)
		return err;

	err = mtk_get_chip_id(eth, &eth->chip_id);
	if (err)
		return err;

	eth->hwlro = mtk_is_hwlro_supported(eth);

	for_each_child_of_node(pdev->dev.of_node, mac_np) {
		if (!of_device_is_compatible(mac_np,
					     "mediatek,eth-mac"))
+6 −0
Original line number Diff line number Diff line
@@ -342,6 +342,11 @@
#define GPIO_BIAS_CTRL		0xed0
#define GPIO_DRV_SEL10		0xf00

/* ethernet subsystem chip id register */
#define ETHSYS_CHIPID0_3	0x0
#define ETHSYS_CHIPID4_7	0x4
#define MT7623_ETH		7623

/* ethernet subsystem config register */
#define ETHSYS_SYSCFG0		0x14
#define SYSCFG0_GE_MASK		0x3
@@ -534,6 +539,7 @@ struct mtk_eth {
	unsigned long			sysclk;
	struct regmap			*ethsys;
	struct regmap			*pctl;
	u32				chip_id;
	bool				hwlro;
	atomic_t			dma_refcnt;
	struct mtk_tx_ring		tx_ring;