[U-Boot] [PATCH v2 6/6] driver: net: fsl-mc: Add support of multiple phys for dpmac
Pankaj Bansal
pankaj.bansal at nxp.com
Mon Jul 30 08:05:44 UTC 2018
Hi Joe,
I have incorporated all your review comments except one:
"This should jut call wriop_init_dpmac_enet_if(). You can just set
dpmac_info[dpmac_id].enabled = 0 after calling
wriop_init_dpmac_enet_if()."
Actually in wriop_init_dpmac, we assign -1 to phy_addr array and NULL to phydev array irrespective of enet_if.
If we call wriop_init_dpmac_enet_if from wriop_init_dpmac then this would be done only for dpmacs for which enet_if is not PHY_INTERFACE_MODE_NONE.
Regards,
Pankaj Bansal
> -----Original Message-----
> From: Pankaj Bansal
> Sent: Monday, July 30, 2018 6:45 PM
> To: u-boot at lists.denx.de; joe.hershberger at ni.com
> Cc: Prabhakar Kushwaha <prabhakar.kushwaha at nxp.com>; Priyanka Jain
> <priyanka.jain at nxp.com>; Varun Sethi <V.Sethi at nxp.com>; York Sun
> <york.sun at nxp.com>; Pankaj Bansal <pankaj.bansal at nxp.com>
> Subject: [PATCH v2 6/6] driver: net: fsl-mc: Add support of multiple phys
> for dpmac
>
> Till now we have had cases where we had one phy device per dpmac.
> Now, with the upcoming products (LX2160AQDS), we have cases, where
> there are sometimes two phy devices for one dpmac. One phy for TX lanes
> and one phy for RX lanes. to handle such cases, add the support for multiple
> phys in ethernet driver. The ethernet link is up if all the phy devices
> connected to one dpmac report link up. also the link capabilities are limited
> by the weakest phy device.
>
> i.e. say if there are two phys for one dpmac. one operates at 10G without
> autoneg and other operate at 1G with autoneg. Then the ethernet interface
> will operate at 1G without autoneg.
>
> Signed-off-by: Pankaj Bansal <pankaj.bansal at nxp.com>
> ---
>
> Notes:
> V2:
> - use single-line comment format.
> - use WRIOP_MAX_PHY_NUM.
> - use -ENODEV or -EINVAL instead of -1 wherever appropriate
> - include the variable names in the headers too.
> - Change the return type of some functions from void to int so that
> a meaningful error message can be returned
>
> board/freescale/ls1088a/eth_ls1088aqds.c | 18 +++---
> board/freescale/ls1088a/eth_ls1088ardb.c | 21 ++++---
> board/freescale/ls2080aqds/eth.c | 26 ++++----
> board/freescale/ls2080ardb/eth_ls2080rdb.c | 24 +++----
> drivers/net/ldpaa_eth/ldpaa_eth.c | 66 ++++++++++++++------
> drivers/net/ldpaa_eth/ldpaa_wriop.c | 61 +++++++++++-------
> include/fsl-mc/ldpaa_wriop.h | 45 ++++++-------
> 7 files changed, 152 insertions(+), 109 deletions(-)
>
> diff --git a/board/freescale/ls1088a/eth_ls1088aqds.c
> b/board/freescale/ls1088a/eth_ls1088aqds.c
> index 40b1a0e631..f16b78cf03 100644
> --- a/board/freescale/ls1088a/eth_ls1088aqds.c
> +++ b/board/freescale/ls1088a/eth_ls1088aqds.c
> @@ -487,16 +487,16 @@ void ls1088a_handle_phy_interface_sgmii(int
> dpmac_id)
> case 0x3A:
> switch (dpmac_id) {
> case 1:
> - wriop_set_phy_address(dpmac_id,
> riser_phy_addr[1]);
> + wriop_set_phy_address(dpmac_id, 0,
> riser_phy_addr[1]);
> break;
> case 2:
> - wriop_set_phy_address(dpmac_id,
> riser_phy_addr[0]);
> + wriop_set_phy_address(dpmac_id, 0,
> riser_phy_addr[0]);
> break;
> case 3:
> - wriop_set_phy_address(dpmac_id,
> riser_phy_addr[3]);
> + wriop_set_phy_address(dpmac_id, 0,
> riser_phy_addr[3]);
> break;
> case 7:
> - wriop_set_phy_address(dpmac_id,
> riser_phy_addr[2]);
> + wriop_set_phy_address(dpmac_id, 0,
> riser_phy_addr[2]);
> break;
> default:
> printf("WRIOP: Wrong DPMAC%d set to SGMII",
> dpmac_id); @@ -532,13 +532,13 @@ void
> ls1088a_handle_phy_interface_qsgmii(int dpmac_id)
> case 4:
> case 5:
> case 6:
> - wriop_set_phy_address(dpmac_id, dpmac_id + 9);
> + wriop_set_phy_address(dpmac_id, 0, dpmac_id +
> 9);
> break;
> case 7:
> case 8:
> case 9:
> case 10:
> - wriop_set_phy_address(dpmac_id, dpmac_id + 1);
> + wriop_set_phy_address(dpmac_id, 0, dpmac_id +
> 1);
> break;
> }
>
> @@ -567,7 +567,7 @@ void ls1088a_handle_phy_interface_xsgmii(int i)
> case 0x15:
> case 0x1D:
> case 0x1E:
> - wriop_set_phy_address(i, i + 26);
> + wriop_set_phy_address(i, 0, i + 26);
> ls1088a_qds_enable_SFP_TX(SFP_TX);
> break;
> default:
> @@ -590,13 +590,13 @@ static void
> ls1088a_handle_phy_interface_rgmii(int dpmac_id)
>
> switch (dpmac_id) {
> case 4:
> - wriop_set_phy_address(dpmac_id, RGMII_PHY1_ADDR);
> + wriop_set_phy_address(dpmac_id, 0, RGMII_PHY1_ADDR);
> dpmac_info[dpmac_id].board_mux = EMI1_RGMII1;
> bus = mii_dev_for_muxval(EMI1_RGMII1);
> wriop_set_mdio(dpmac_id, bus);
> break;
> case 5:
> - wriop_set_phy_address(dpmac_id, RGMII_PHY2_ADDR);
> + wriop_set_phy_address(dpmac_id, 0, RGMII_PHY2_ADDR);
> dpmac_info[dpmac_id].board_mux = EMI1_RGMII2;
> bus = mii_dev_for_muxval(EMI1_RGMII2);
> wriop_set_mdio(dpmac_id, bus);
> diff --git a/board/freescale/ls1088a/eth_ls1088ardb.c
> b/board/freescale/ls1088a/eth_ls1088ardb.c
> index 418f362e9a..a2b52a879b 100644
> --- a/board/freescale/ls1088a/eth_ls1088ardb.c
> +++ b/board/freescale/ls1088a/eth_ls1088ardb.c
> @@ -55,16 +55,17 @@ int board_eth_init(bd_t *bis)
> * a MAC has no PHY address, we give a PHY address to XFI
> * MAC error.
> */
> - wriop_set_phy_address(WRIOP1_DPMAC1, 0x0a);
> - wriop_set_phy_address(WRIOP1_DPMAC2,
> AQ_PHY_ADDR1);
> - wriop_set_phy_address(WRIOP1_DPMAC3,
> QSGMII1_PORT1_PHY_ADDR);
> - wriop_set_phy_address(WRIOP1_DPMAC4,
> QSGMII1_PORT2_PHY_ADDR);
> - wriop_set_phy_address(WRIOP1_DPMAC5,
> QSGMII1_PORT3_PHY_ADDR);
> - wriop_set_phy_address(WRIOP1_DPMAC6,
> QSGMII1_PORT4_PHY_ADDR);
> - wriop_set_phy_address(WRIOP1_DPMAC7,
> QSGMII2_PORT1_PHY_ADDR);
> - wriop_set_phy_address(WRIOP1_DPMAC8,
> QSGMII2_PORT2_PHY_ADDR);
> - wriop_set_phy_address(WRIOP1_DPMAC9,
> QSGMII2_PORT3_PHY_ADDR);
> - wriop_set_phy_address(WRIOP1_DPMAC10,
> QSGMII2_PORT4_PHY_ADDR);
> + wriop_set_phy_address(WRIOP1_DPMAC1, 0, 0x0a);
> + wriop_set_phy_address(WRIOP1_DPMAC2, 0,
> AQ_PHY_ADDR1);
> + wriop_set_phy_address(WRIOP1_DPMAC3, 0,
> QSGMII1_PORT1_PHY_ADDR);
> + wriop_set_phy_address(WRIOP1_DPMAC4, 0,
> QSGMII1_PORT2_PHY_ADDR);
> + wriop_set_phy_address(WRIOP1_DPMAC5, 0,
> QSGMII1_PORT3_PHY_ADDR);
> + wriop_set_phy_address(WRIOP1_DPMAC6, 0,
> QSGMII1_PORT4_PHY_ADDR);
> + wriop_set_phy_address(WRIOP1_DPMAC7, 0,
> QSGMII2_PORT1_PHY_ADDR);
> + wriop_set_phy_address(WRIOP1_DPMAC8, 0,
> QSGMII2_PORT2_PHY_ADDR);
> + wriop_set_phy_address(WRIOP1_DPMAC9, 0,
> QSGMII2_PORT3_PHY_ADDR);
> + wriop_set_phy_address(WRIOP1_DPMAC10, 0,
> + QSGMII2_PORT4_PHY_ADDR);
>
> break;
> default:
> diff --git a/board/freescale/ls2080aqds/eth.c
> b/board/freescale/ls2080aqds/eth.c
> index 989d57e09b..f706fd4cb6 100644
> --- a/board/freescale/ls2080aqds/eth.c
> +++ b/board/freescale/ls2080aqds/eth.c
> @@ -623,7 +623,7 @@ void ls2080a_handle_phy_interface_sgmii(int
> dpmac_id)
> switch (++slot) {
> case 1:
> /* Slot housing a SGMII riser card? */
> - wriop_set_phy_address(dpmac_id,
> + wriop_set_phy_address(dpmac_id, 0,
> riser_phy_addr[dpmac_id - 1]);
> dpmac_info[dpmac_id].board_mux = EMI1_SLOT1;
> bus = mii_dev_for_muxval(EMI1_SLOT1); @@ -
> 631,7 +631,7 @@ void ls2080a_handle_phy_interface_sgmii(int dpmac_id)
> break;
> case 2:
> /* Slot housing a SGMII riser card? */
> - wriop_set_phy_address(dpmac_id,
> + wriop_set_phy_address(dpmac_id, 0,
> riser_phy_addr[dpmac_id - 1]);
> dpmac_info[dpmac_id].board_mux = EMI1_SLOT2;
> bus = mii_dev_for_muxval(EMI1_SLOT2); @@ -
> 641,18 +641,18 @@ void ls2080a_handle_phy_interface_sgmii(int
> dpmac_id)
> if (slot == EMI_NONE)
> return;
> if (serdes1_prtcl == 0x39) {
> - wriop_set_phy_address(dpmac_id,
> + wriop_set_phy_address(dpmac_id, 0,
> riser_phy_addr[dpmac_id - 2]);
> if (dpmac_id >= 6 && hwconfig_f("xqsgmii",
>
> env_hwconfig))
> - wriop_set_phy_address(dpmac_id,
> + wriop_set_phy_address(dpmac_id,
> 0,
> riser_phy_addr[dpmac_id -
> 3]);
> } else {
> - wriop_set_phy_address(dpmac_id,
> + wriop_set_phy_address(dpmac_id, 0,
> riser_phy_addr[dpmac_id - 2]);
> if (dpmac_id >= 7 && hwconfig_f("xqsgmii",
>
> env_hwconfig))
> - wriop_set_phy_address(dpmac_id,
> + wriop_set_phy_address(dpmac_id,
> 0,
> riser_phy_addr[dpmac_id -
> 3]);
> }
> dpmac_info[dpmac_id].board_mux = EMI1_SLOT3;
> @@ -691,7 +691,7 @@ serdes2:
> break;
> case 4:
> /* Slot housing a SGMII riser card? */
> - wriop_set_phy_address(dpmac_id,
> + wriop_set_phy_address(dpmac_id, 0,
> riser_phy_addr[dpmac_id - 9]);
> dpmac_info[dpmac_id].board_mux = EMI1_SLOT4;
> bus = mii_dev_for_muxval(EMI1_SLOT4); @@ -
> 701,14 +701,14 @@ serdes2:
> if (slot == EMI_NONE)
> return;
> if (serdes2_prtcl == 0x47) {
> - wriop_set_phy_address(dpmac_id,
> + wriop_set_phy_address(dpmac_id, 0,
> riser_phy_addr[dpmac_id - 10]);
> if (dpmac_id >= 14 &&
> hwconfig_f("xqsgmii",
>
> env_hwconfig))
> - wriop_set_phy_address(dpmac_id,
> + wriop_set_phy_address(dpmac_id,
> 0,
> riser_phy_addr[dpmac_id -
> 11]);
> } else {
> - wriop_set_phy_address(dpmac_id,
> + wriop_set_phy_address(dpmac_id, 0,
> riser_phy_addr[dpmac_id - 11]);
> }
> dpmac_info[dpmac_id].board_mux = EMI1_SLOT5;
> @@ -717,7 +717,7 @@ serdes2:
> break;
> case 6:
> /* Slot housing a SGMII riser card? */
> - wriop_set_phy_address(dpmac_id,
> + wriop_set_phy_address(dpmac_id, 0,
> riser_phy_addr[dpmac_id - 13]);
> dpmac_info[dpmac_id].board_mux = EMI1_SLOT6;
> bus = mii_dev_for_muxval(EMI1_SLOT6); @@ -
> 775,7 +775,7 @@ void ls2080a_handle_phy_interface_qsgmii(int
> dpmac_id)
> switch (++slot) {
> case 1:
> /* Slot housing a QSGMII riser card? */
> - wriop_set_phy_address(dpmac_id, dpmac_id - 1);
> + wriop_set_phy_address(dpmac_id, 0, dpmac_id -
> 1);
> dpmac_info[dpmac_id].board_mux = EMI1_SLOT1;
> bus = mii_dev_for_muxval(EMI1_SLOT1);
> wriop_set_mdio(dpmac_id, bus);
> @@ -819,7 +819,7 @@ void ls2080a_handle_phy_interface_xsgmii(int i)
> * the XAUI card is used for the XFI MAC, which will cause
> * error.
> */
> - wriop_set_phy_address(i, i + 4);
> + wriop_set_phy_address(i, 0, i + 4);
> ls2080a_qds_enable_SFP_TX(SFP_TX);
>
> break;
> diff --git a/board/freescale/ls2080ardb/eth_ls2080rdb.c
> b/board/freescale/ls2080ardb/eth_ls2080rdb.c
> index 45f1d60322..62c7a7a315 100644
> --- a/board/freescale/ls2080ardb/eth_ls2080rdb.c
> +++ b/board/freescale/ls2080ardb/eth_ls2080rdb.c
> @@ -50,21 +50,21 @@ int board_eth_init(bd_t *bis)
>
> switch (srds_s1) {
> case 0x2A:
> - wriop_set_phy_address(WRIOP1_DPMAC1,
> CORTINA_PHY_ADDR1);
> - wriop_set_phy_address(WRIOP1_DPMAC2,
> CORTINA_PHY_ADDR2);
> - wriop_set_phy_address(WRIOP1_DPMAC3,
> CORTINA_PHY_ADDR3);
> - wriop_set_phy_address(WRIOP1_DPMAC4,
> CORTINA_PHY_ADDR4);
> - wriop_set_phy_address(WRIOP1_DPMAC5,
> AQ_PHY_ADDR1);
> - wriop_set_phy_address(WRIOP1_DPMAC6,
> AQ_PHY_ADDR2);
> - wriop_set_phy_address(WRIOP1_DPMAC7,
> AQ_PHY_ADDR3);
> - wriop_set_phy_address(WRIOP1_DPMAC8,
> AQ_PHY_ADDR4);
> + wriop_set_phy_address(WRIOP1_DPMAC1, 0,
> CORTINA_PHY_ADDR1);
> + wriop_set_phy_address(WRIOP1_DPMAC2, 0,
> CORTINA_PHY_ADDR2);
> + wriop_set_phy_address(WRIOP1_DPMAC3, 0,
> CORTINA_PHY_ADDR3);
> + wriop_set_phy_address(WRIOP1_DPMAC4, 0,
> CORTINA_PHY_ADDR4);
> + wriop_set_phy_address(WRIOP1_DPMAC5, 0,
> AQ_PHY_ADDR1);
> + wriop_set_phy_address(WRIOP1_DPMAC6, 0,
> AQ_PHY_ADDR2);
> + wriop_set_phy_address(WRIOP1_DPMAC7, 0,
> AQ_PHY_ADDR3);
> + wriop_set_phy_address(WRIOP1_DPMAC8, 0,
> AQ_PHY_ADDR4);
>
> break;
> case 0x4B:
> - wriop_set_phy_address(WRIOP1_DPMAC1,
> CORTINA_PHY_ADDR1);
> - wriop_set_phy_address(WRIOP1_DPMAC2,
> CORTINA_PHY_ADDR2);
> - wriop_set_phy_address(WRIOP1_DPMAC3,
> CORTINA_PHY_ADDR3);
> - wriop_set_phy_address(WRIOP1_DPMAC4,
> CORTINA_PHY_ADDR4);
> + wriop_set_phy_address(WRIOP1_DPMAC1, 0,
> CORTINA_PHY_ADDR1);
> + wriop_set_phy_address(WRIOP1_DPMAC2, 0,
> CORTINA_PHY_ADDR2);
> + wriop_set_phy_address(WRIOP1_DPMAC3, 0,
> CORTINA_PHY_ADDR3);
> + wriop_set_phy_address(WRIOP1_DPMAC4, 0,
> CORTINA_PHY_ADDR4);
>
> break;
> default:
> diff --git a/drivers/net/ldpaa_eth/ldpaa_eth.c
> b/drivers/net/ldpaa_eth/ldpaa_eth.c
> index d2bec31dd7..4fc5a0626b 100644
> --- a/drivers/net/ldpaa_eth/ldpaa_eth.c
> +++ b/drivers/net/ldpaa_eth/ldpaa_eth.c
> @@ -23,26 +23,40 @@ static int init_phy(struct eth_device *dev)
> struct ldpaa_eth_priv *priv = (struct ldpaa_eth_priv *)dev->priv;
> struct phy_device *phydev = NULL;
> struct mii_dev *bus;
> - int ret;
> + int phy_addr, phy_num;
> + int ret = 0;
>
> bus = wriop_get_mdio(priv->dpmac_id);
> if (bus == NULL)
> return 0;
>
> - phydev = phy_connect(bus, wriop_get_phy_address(priv-
> >dpmac_id),
> - dev, wriop_get_enet_if(priv->dpmac_id));
> - if (!phydev) {
> - printf("Failed to connect\n");
> - return -1;
> - }
> -
> - wriop_set_phy_dev(priv->dpmac_id, phydev);
> + for (phy_num = 0; phy_num < WRIOP_MAX_PHY_NUM;
> phy_num++) {
> + phy_addr = wriop_get_phy_address(priv->dpmac_id,
> phy_num);
> + if (phy_addr < 0)
> + continue;
>
> - ret = phy_config(phydev);
> + phydev = phy_connect(bus, phy_addr, dev,
> + wriop_get_enet_if(priv->dpmac_id));
> + if (!phydev) {
> + printf("Failed to connect\n");
> + ret = -ENODEV;
> + break;
> + }
> + wriop_set_phy_dev(priv->dpmac_id, phy_num, phydev);
> + ret = phy_config(phydev);
> + if (ret)
> + break;
> + }
>
> if (ret) {
> - free(phydev);
> - wriop_set_phy_dev(priv->dpmac_id, NULL);
> + for (phy_num = 0; phy_num < WRIOP_MAX_PHY_NUM;
> phy_num++) {
> + phydev = wriop_get_phy_dev(priv->dpmac_id,
> phy_num);
> + if (!phydev)
> + continue;
> +
> + free(phydev);
> + wriop_set_phy_dev(priv->dpmac_id, phy_num,
> NULL);
> + }
> }
>
> return ret;
> @@ -390,10 +404,10 @@ static int ldpaa_get_dpmac_state(struct
> ldpaa_eth_priv *priv, {
> struct phy_device *phydev = NULL;
> phy_interface_t enet_if;
> + int phy_num, phys_detected;
> int err;
>
> - /* let's start off with maximum capabilities
> - */
> + /* let's start off with maximum capabilities */
> enet_if = wriop_get_enet_if(priv->dpmac_id);
> switch (enet_if) {
> case PHY_INTERFACE_MODE_XGMII:
> @@ -405,15 +419,22 @@ static int ldpaa_get_dpmac_state(struct
> ldpaa_eth_priv *priv,
> }
> state->up = 1;
>
> + phys_detected = 0;
> #ifdef CONFIG_PHYLIB
> state->options |= DPMAC_LINK_OPT_AUTONEG;
>
> - phydev = wriop_get_phy_dev(priv->dpmac_id);
> - if (phydev) {
> + /* start the phy devices one by one and update the dpmac state */
> + for (phy_num = 0; phy_num < WRIOP_MAX_PHY_NUM;
> phy_num++) {
> + phydev = wriop_get_phy_dev(priv->dpmac_id, phy_num);
> + if (!phydev)
> + continue;
> +
> + phys_detected++;
> err = phy_startup(phydev);
> if (err) {
> printf("%s: Could not initialize\n", phydev->dev-
> >name);
> state->up = 0;
> + break;
> }
> if (phydev->link) {
> state->rate = min(state->rate, (uint32_t)phydev-
> >speed); @@ -422,11 +443,13 @@ static int
> ldpaa_get_dpmac_state(struct ldpaa_eth_priv *priv,
> if (!phydev->autoneg)
> state->options &=
> ~DPMAC_LINK_OPT_AUTONEG;
> } else {
> + /* break out of loop even if one phy is down */
> state->up = 0;
> + break;
> }
> }
> #endif
> - if (!phydev)
> + if (!phys_detected)
> state->options &= ~DPMAC_LINK_OPT_AUTONEG;
>
> if (!state->up) {
> @@ -568,6 +591,7 @@ static void ldpaa_eth_stop(struct eth_device
> *net_dev)
> struct ldpaa_eth_priv *priv = (struct ldpaa_eth_priv *)net_dev-
> >priv;
> int err = 0;
> struct phy_device *phydev = NULL;
> + int phy_num;
>
> if ((net_dev->state == ETH_STATE_PASSIVE) ||
> (net_dev->state == ETH_STATE_INIT)) @@ -600,9 +624,11 @@
> static void ldpaa_eth_stop(struct eth_device *net_dev)
> printf("dpni_disable() failed\n");
>
> #ifdef CONFIG_PHYLIB
> - phydev = wriop_get_phy_dev(priv->dpmac_id);
> - if (phydev)
> - phy_shutdown(phydev);
> + for (phy_num = 0; phy_num < WRIOP_MAX_PHY_NUM;
> phy_num++) {
> + phydev = wriop_get_phy_dev(priv->dpmac_id, phy_num);
> + if (phydev)
> + phy_shutdown(phydev);
> + }
> #endif
>
> /* Free DPBP handle and reset. */
> diff --git a/drivers/net/ldpaa_eth/ldpaa_wriop.c
> b/drivers/net/ldpaa_eth/ldpaa_wriop.c
> index afbb1ca91e..be3101d26a 100644
> --- a/drivers/net/ldpaa_eth/ldpaa_wriop.c
> +++ b/drivers/net/ldpaa_eth/ldpaa_wriop.c
> @@ -22,11 +22,10 @@ __weak phy_interface_t wriop_dpmac_enet_if(int
> dpmac_id, int lane_prtc) void wriop_init_dpmac(int sd, int dpmac_id, int
> lane_prtcl) {
> phy_interface_t enet_if;
> + int phy_num;
>
> dpmac_info[dpmac_id].enabled = 0;
> dpmac_info[dpmac_id].id = 0;
> - dpmac_info[dpmac_id].phy_addr = -1;
> - dpmac_info[dpmac_id].phydev = NULL;
> dpmac_info[dpmac_id].enet_if = PHY_INTERFACE_MODE_NONE;
>
> enet_if = wriop_dpmac_enet_if(dpmac_id, lane_prtcl); @@ -35,15
> +34,23 @@ void wriop_init_dpmac(int sd, int dpmac_id, int lane_prtcl)
> dpmac_info[dpmac_id].id = dpmac_id;
> dpmac_info[dpmac_id].enet_if = enet_if;
> }
> + for (phy_num = 0; phy_num < WRIOP_MAX_PHY_NUM;
> phy_num++) {
> + dpmac_info[dpmac_id].phydev[phy_num] = NULL;
> + dpmac_info[dpmac_id].phy_addr[phy_num] = -1;
> + }
> }
>
> void wriop_init_dpmac_enet_if(int dpmac_id, phy_interface_t enet_if) {
> + int phy_num;
> +
> dpmac_info[dpmac_id].enabled = 1;
> dpmac_info[dpmac_id].id = dpmac_id;
> - dpmac_info[dpmac_id].phy_addr = -1;
> dpmac_info[dpmac_id].enet_if = enet_if;
> - dpmac_info[dpmac_id].phydev = NULL;
> + for (phy_num = 0; phy_num < WRIOP_MAX_PHY_NUM;
> phy_num++) {
> + dpmac_info[dpmac_id].phydev[phy_num] = NULL;
> + dpmac_info[dpmac_id].phy_addr[phy_num] = -1;
> + }
> }
>
>
> @@ -60,45 +67,45 @@ static int wriop_dpmac_to_index(int dpmac_id)
> return -1;
> }
>
> -void wriop_disable_dpmac(int dpmac_id)
> +int wriop_disable_dpmac(int dpmac_id)
> {
> int i = wriop_dpmac_to_index(dpmac_id);
>
> if (i == -1)
> - return;
> + return -ENODEV;
>
> dpmac_info[i].enabled = 0;
> wriop_dpmac_disable(dpmac_id);
> }
>
> -void wriop_enable_dpmac(int dpmac_id)
> +int wriop_enable_dpmac(int dpmac_id)
> {
> int i = wriop_dpmac_to_index(dpmac_id);
>
> if (i == -1)
> - return;
> + return -ENODEV;
>
> dpmac_info[i].enabled = 1;
> wriop_dpmac_enable(dpmac_id);
> }
>
> -u8 wriop_is_enabled_dpmac(int dpmac_id)
> +int wriop_is_enabled_dpmac(int dpmac_id)
> {
> int i = wriop_dpmac_to_index(dpmac_id);
>
> if (i == -1)
> - return -1;
> + return -ENODEV;
>
> return dpmac_info[i].enabled;
> }
>
>
> -void wriop_set_mdio(int dpmac_id, struct mii_dev *bus)
> +int wriop_set_mdio(int dpmac_id, struct mii_dev *bus)
> {
> int i = wriop_dpmac_to_index(dpmac_id);
>
> if (i == -1)
> - return;
> + return -ENODEV;
>
> dpmac_info[i].bus = bus;
> }
> @@ -113,44 +120,52 @@ struct mii_dev *wriop_get_mdio(int dpmac_id)
> return dpmac_info[i].bus;
> }
>
> -void wriop_set_phy_address(int dpmac_id, int address)
> +int wriop_set_phy_address(int dpmac_id, int phy_num, int address)
> {
> int i = wriop_dpmac_to_index(dpmac_id);
>
> if (i == -1)
> - return;
> + return -ENODEV;
> + if (phy_num < 0 || phy_num >= WRIOP_MAX_PHY_NUM)
> + return -EINVAL;
>
> - dpmac_info[i].phy_addr = address;
> + dpmac_info[i].phy_addr[phy_num] = address;
> }
>
> -int wriop_get_phy_address(int dpmac_id)
> +int wriop_get_phy_address(int dpmac_id, int phy_num)
> {
> int i = wriop_dpmac_to_index(dpmac_id);
>
> if (i == -1)
> - return -1;
> + return -ENODEV;
> + if (phy_num < 0 || phy_num >= WRIOP_MAX_PHY_NUM)
> + return -EINVAL;
>
> - return dpmac_info[i].phy_addr;
> + return dpmac_info[i].phy_addr[phy_num];
> }
>
> -void wriop_set_phy_dev(int dpmac_id, struct phy_device *phydev)
> +int wriop_set_phy_dev(int dpmac_id, int phy_num, struct phy_device
> +*phydev)
> {
> int i = wriop_dpmac_to_index(dpmac_id);
>
> if (i == -1)
> - return;
> + return -ENODEV;
> + if (phy_num < 0 || phy_num >= WRIOP_MAX_PHY_NUM)
> + return -EINVAL;
>
> - dpmac_info[i].phydev = phydev;
> + dpmac_info[i].phydev[phy_num] = phydev;
> }
>
> -struct phy_device *wriop_get_phy_dev(int dpmac_id)
> +struct phy_device *wriop_get_phy_dev(int dpmac_id, int phy_num)
> {
> int i = wriop_dpmac_to_index(dpmac_id);
>
> if (i == -1)
> return NULL;
> + if (phy_num < 0 || phy_num >= WRIOP_MAX_PHY_NUM)
> + return NULL;
>
> - return dpmac_info[i].phydev;
> + return dpmac_info[i].phydev[phy_num];
> }
>
> phy_interface_t wriop_get_enet_if(int dpmac_id) diff --git a/include/fsl-
> mc/ldpaa_wriop.h b/include/fsl-mc/ldpaa_wriop.h index
> 8971c6c55b..b55c39cbb2 100644
> --- a/include/fsl-mc/ldpaa_wriop.h
> +++ b/include/fsl-mc/ldpaa_wriop.h
> @@ -6,7 +6,11 @@
> #ifndef __LDPAA_WRIOP_H
> #define __LDPAA_WRIOP_H
>
> - #include <phy.h>
> +#include <phy.h>
> +
> +#define DEFAULT_WRIOP_MDIO1_NAME "FSL_MDIO0"
> +#define DEFAULT_WRIOP_MDIO2_NAME "FSL_MDIO1"
> +#define WRIOP_MAX_PHY_NUM 2
>
> enum wriop_port {
> WRIOP1_DPMAC1 = 1,
> @@ -40,33 +44,30 @@ struct wriop_dpmac_info {
> u8 enabled;
> u8 id;
> u8 board_mux;
> - int phy_addr;
> + int phy_addr[WRIOP_MAX_PHY_NUM];
> phy_interface_t enet_if;
> - struct phy_device *phydev;
> + struct phy_device *phydev[WRIOP_MAX_PHY_NUM];
> struct mii_dev *bus;
> };
>
> extern struct wriop_dpmac_info dpmac_info[NUM_WRIOP_PORTS];
>
> -#define DEFAULT_WRIOP_MDIO1_NAME "FSL_MDIO0"
> -#define DEFAULT_WRIOP_MDIO2_NAME "FSL_MDIO1"
> -
> -void wriop_init_dpmac(int, int, int);
> -void wriop_disable_dpmac(int);
> -void wriop_enable_dpmac(int);
> -u8 wriop_is_enabled_dpmac(int dpmac_id); -void wriop_set_mdio(int,
> struct mii_dev *); -struct mii_dev *wriop_get_mdio(int); -void
> wriop_set_phy_address(int, int); -int wriop_get_phy_address(int); -void
> wriop_set_phy_dev(int, struct phy_device *); -struct phy_device
> *wriop_get_phy_dev(int); -phy_interface_t wriop_get_enet_if(int);
> +void wriop_init_dpmac(int sd, int dpmac_id, int lane_prtcl); void
> +wriop_init_dpmac_enet_if(int dpmac_id, phy_interface_t enet_if); int
> +wriop_disable_dpmac(int dpmac_id); int wriop_enable_dpmac(int
> +dpmac_id); int wriop_is_enabled_dpmac(int dpmac_id); int
> +wriop_set_mdio(int dpmac_id, struct mii_dev *bus); struct mii_dev
> +*wriop_get_mdio(int dpmac_id); int wriop_set_phy_address(int
> dpmac_id,
> +int phy_num, int address); int wriop_get_phy_address(int dpmac_id, int
> +phy_num); int wriop_set_phy_dev(int dpmac_id, int phy_num, struct
> +phy_device *phydev); struct phy_device *wriop_get_phy_dev(int
> dpmac_id,
> +int phy_num); phy_interface_t wriop_get_enet_if(int dpmac_id);
>
> -void wriop_dpmac_disable(int);
> -void wriop_dpmac_enable(int);
> -phy_interface_t wriop_dpmac_enet_if(int, int); -void
> wriop_init_dpmac_qsgmii(int, int);
> +void wriop_dpmac_disable(int dpmac_id); void wriop_dpmac_enable(int
> +dpmac_id); phy_interface_t wriop_dpmac_enet_if(int dpmac_id, int
> +lane_prtcl); void wriop_init_dpmac_qsgmii(int sd, int lane_prtcl);
> void wriop_init_rgmii(void);
> -void wriop_init_dpmac_enet_if(int , phy_interface_t);
> #endif /* __LDPAA_WRIOP_H */
> --
> 2.17.1
More information about the U-Boot
mailing list