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: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2016-10-06 21:08:13 -04:00
commit a0ec9319f4
3 changed files with 47 additions and 4 deletions

View file

@ -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>;

View file

@ -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"))

View file

@ -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;