From 92f52b796e2adb97547a32fd668de6ccd971ef72 Mon Sep 17 00:00:00 2001 From: Sham Muthayyan Date: Tue, 12 Sep 2017 14:10:32 +0530 Subject: [PATCH] ipq807x: Aquantia phy init support Change-Id: I0f714e0862c8002aa49497af0b65e5d5e61a8b64 Signed-off-by: Sham Muthayyan --- drivers/net/ipq807x/ipq807x_edma.c | 17 ++++++++++++++++- drivers/net/ipq_common/ipq_phy.h | 3 +++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/net/ipq807x/ipq807x_edma.c b/drivers/net/ipq807x/ipq807x_edma.c index 1f9446b8e3..897dfd8e64 100644 --- a/drivers/net/ipq807x/ipq807x_edma.c +++ b/drivers/net/ipq807x/ipq807x_edma.c @@ -56,6 +56,7 @@ extern int ipq_mdio_read(int mii_id, extern void ipq_qca8075_phy_map_ops(struct phy_ops **ops); extern int ipq_qca8075_phy_init(struct phy_ops **ops); extern int ipq_qca8033_phy_init(struct phy_ops **ops, u32 phy_id); +extern int ipq_qca_aquantia_phy_init(struct phy_ops **ops, u32 phy_id); /* * EDMA hardware instance @@ -1552,12 +1553,15 @@ int ipq807x_edma_init(void *edma_board_cfg) int ret = -1; ipq807x_edma_board_cfg_t ledma_cfg, *edma_cfg; static int sw_init_done = 0; - int port_8033 = -1, node, phy_addr; + int port_8033 = -1, node, phy_addr, aquantia_port = -1; node = fdt_path_offset(gd->fdt_blob, "/ess-switch"); if (node >= 0) port_8033 = fdtdec_get_uint(gd->fdt_blob, node, "8033_port", -1); + if (node >= 0) + aquantia_port = fdtdec_get_uint(gd->fdt_blob, node, "aquantia_port", -1); + memset(c_info, 0, (sizeof(c_info) * IPQ807X_EDMA_DEV)); memset(enet_addr, 0, sizeof(enet_addr)); memset(&ledma_cfg, 0, sizeof(ledma_cfg)); @@ -1640,12 +1644,19 @@ int ipq807x_edma_init(void *edma_board_cfg) for (phy_id = 0; phy_id < PHY_MAX; phy_id++) { if (phy_id == port_8033) phy_addr = QCA8033_PHY_ADDR; + else if (phy_id == aquantia_port) + phy_addr = AQU_PHY_ADDR; else phy_addr = phy_id; phy_chip_id1 = ipq_mdio_read(phy_addr, QCA_PHY_ID1, NULL); phy_chip_id2 = ipq_mdio_read(phy_addr, QCA_PHY_ID2, NULL); phy_chip_id = (phy_chip_id1 << 16) | phy_chip_id2; + if (phy_id == aquantia_port) { + phy_chip_id1 = ipq_mdio_read(0x7, (1<<30) |(1<<16) | QCA_PHY_ID1, NULL); + phy_chip_id2 = ipq_mdio_read(0x7, (1<<30) |(1<<16) | QCA_PHY_ID2, NULL); + phy_chip_id = (phy_chip_id1 << 16) | phy_chip_id2; + } switch(phy_chip_id) { case QCA8075_PHY_V1_0_5P: case QCA8075_PHY_V1_1_5P: @@ -1662,6 +1673,10 @@ int ipq807x_edma_init(void *edma_board_cfg) case QCA8033_PHY: ipq_qca8033_phy_init(&ipq807x_edma_dev[i]->ops[phy_id], phy_addr); break; + case AQUANTIA_PHY_107: + case AQUANTIA_PHY_109: + ipq_qca_aquantia_phy_init(&ipq807x_edma_dev[i]->ops[phy_id], phy_addr); + break; default: ipq_qca8075_phy_map_ops(&ipq807x_edma_dev[i]->ops[phy_id]); break; diff --git a/drivers/net/ipq_common/ipq_phy.h b/drivers/net/ipq_common/ipq_phy.h index 562476ef37..7e9dc1fd6a 100644 --- a/drivers/net/ipq_common/ipq_phy.h +++ b/drivers/net/ipq_common/ipq_phy.h @@ -37,6 +37,9 @@ #define QCA8075_PHY_V1_1_2P 0x004DD0B2 #define QCA8033_PHY 0x004DD074 #define QCA8033_PHY_ADDR 0x6 +#define AQUANTIA_PHY_107 0x03a1b4e2 +#define AQUANTIA_PHY_109 0x03a1b502 +#define AQU_PHY_ADDR 0x7 #define QCA_PHY_ID1 0x2 #define QCA_PHY_ID2 0x3