eth_ls2080rdb.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2015 Freescale Semiconductor, Inc.
  4. *
  5. */
  6. #include <common.h>
  7. #include <command.h>
  8. #include <netdev.h>
  9. #include <malloc.h>
  10. #include <fsl_mdio.h>
  11. #include <miiphy.h>
  12. #include <phy.h>
  13. #include <fm_eth.h>
  14. #include <asm/io.h>
  15. #include <exports.h>
  16. #include <asm/arch/fsl_serdes.h>
  17. #include <fsl-mc/fsl_mc.h>
  18. #include <fsl-mc/ldpaa_wriop.h>
  19. DECLARE_GLOBAL_DATA_PTR;
  20. int board_eth_init(bd_t *bis)
  21. {
  22. #if defined(CONFIG_FSL_MC_ENET)
  23. int i, interface;
  24. struct memac_mdio_info mdio_info;
  25. struct mii_dev *dev;
  26. struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
  27. u32 srds_s1;
  28. struct memac_mdio_controller *reg;
  29. srds_s1 = in_le32(&gur->rcwsr[28]) &
  30. FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK;
  31. srds_s1 >>= FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT;
  32. reg = (struct memac_mdio_controller *)CONFIG_SYS_FSL_WRIOP1_MDIO1;
  33. mdio_info.regs = reg;
  34. mdio_info.name = DEFAULT_WRIOP_MDIO1_NAME;
  35. /* Register the EMI 1 */
  36. fm_memac_mdio_init(bis, &mdio_info);
  37. reg = (struct memac_mdio_controller *)CONFIG_SYS_FSL_WRIOP1_MDIO2;
  38. mdio_info.regs = reg;
  39. mdio_info.name = DEFAULT_WRIOP_MDIO2_NAME;
  40. /* Register the EMI 2 */
  41. fm_memac_mdio_init(bis, &mdio_info);
  42. switch (srds_s1) {
  43. case 0x2A:
  44. wriop_set_phy_address(WRIOP1_DPMAC1, CORTINA_PHY_ADDR1);
  45. wriop_set_phy_address(WRIOP1_DPMAC2, CORTINA_PHY_ADDR2);
  46. wriop_set_phy_address(WRIOP1_DPMAC3, CORTINA_PHY_ADDR3);
  47. wriop_set_phy_address(WRIOP1_DPMAC4, CORTINA_PHY_ADDR4);
  48. wriop_set_phy_address(WRIOP1_DPMAC5, AQ_PHY_ADDR1);
  49. wriop_set_phy_address(WRIOP1_DPMAC6, AQ_PHY_ADDR2);
  50. wriop_set_phy_address(WRIOP1_DPMAC7, AQ_PHY_ADDR3);
  51. wriop_set_phy_address(WRIOP1_DPMAC8, AQ_PHY_ADDR4);
  52. break;
  53. case 0x4B:
  54. wriop_set_phy_address(WRIOP1_DPMAC1, CORTINA_PHY_ADDR1);
  55. wriop_set_phy_address(WRIOP1_DPMAC2, CORTINA_PHY_ADDR2);
  56. wriop_set_phy_address(WRIOP1_DPMAC3, CORTINA_PHY_ADDR3);
  57. wriop_set_phy_address(WRIOP1_DPMAC4, CORTINA_PHY_ADDR4);
  58. break;
  59. default:
  60. printf("SerDes1 protocol 0x%x is not supported on LS2080aRDB\n",
  61. srds_s1);
  62. break;
  63. }
  64. for (i = WRIOP1_DPMAC1; i <= WRIOP1_DPMAC4; i++) {
  65. interface = wriop_get_enet_if(i);
  66. switch (interface) {
  67. case PHY_INTERFACE_MODE_XGMII:
  68. dev = miiphy_get_dev_by_name(DEFAULT_WRIOP_MDIO1_NAME);
  69. wriop_set_mdio(i, dev);
  70. break;
  71. default:
  72. break;
  73. }
  74. }
  75. for (i = WRIOP1_DPMAC5; i <= WRIOP1_DPMAC8; i++) {
  76. switch (wriop_get_enet_if(i)) {
  77. case PHY_INTERFACE_MODE_XGMII:
  78. dev = miiphy_get_dev_by_name(DEFAULT_WRIOP_MDIO2_NAME);
  79. wriop_set_mdio(i, dev);
  80. break;
  81. default:
  82. break;
  83. }
  84. }
  85. cpu_eth_init(bis);
  86. #endif /* CONFIG_FSL_MC_ENET */
  87. #ifdef CONFIG_PHY_AQUANTIA
  88. /*
  89. * Export functions to be used by AQ firmware
  90. * upload application
  91. */
  92. gd->jt->strcpy = strcpy;
  93. gd->jt->mdelay = mdelay;
  94. gd->jt->mdio_get_current_dev = mdio_get_current_dev;
  95. gd->jt->phy_find_by_mask = phy_find_by_mask;
  96. gd->jt->mdio_phydev_for_ethname = mdio_phydev_for_ethname;
  97. gd->jt->miiphy_set_current_dev = miiphy_set_current_dev;
  98. #endif
  99. return pci_eth_init(bis);
  100. }
  101. #if defined(CONFIG_RESET_PHY_R)
  102. void reset_phy(void)
  103. {
  104. mc_env_boot();
  105. }
  106. #endif /* CONFIG_RESET_PHY_R */