mac.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Applied Micro X-Gene SoC Ethernet v2 Driver
  4. *
  5. * Copyright (c) 2017, Applied Micro Circuits Corporation
  6. * Author(s): Iyappan Subramanian <[email protected]>
  7. * Keyur Chudgar <[email protected]>
  8. */
  9. #include "main.h"
  10. void xge_mac_reset(struct xge_pdata *pdata)
  11. {
  12. xge_wr_csr(pdata, MAC_CONFIG_1, SOFT_RESET);
  13. xge_wr_csr(pdata, MAC_CONFIG_1, 0);
  14. }
  15. void xge_mac_set_speed(struct xge_pdata *pdata)
  16. {
  17. u32 icm0, icm2, ecm0, mc2;
  18. u32 intf_ctrl, rgmii;
  19. icm0 = xge_rd_csr(pdata, ICM_CONFIG0_REG_0);
  20. icm2 = xge_rd_csr(pdata, ICM_CONFIG2_REG_0);
  21. ecm0 = xge_rd_csr(pdata, ECM_CONFIG0_REG_0);
  22. rgmii = xge_rd_csr(pdata, RGMII_REG_0);
  23. mc2 = xge_rd_csr(pdata, MAC_CONFIG_2);
  24. intf_ctrl = xge_rd_csr(pdata, INTERFACE_CONTROL);
  25. icm2 |= CFG_WAITASYNCRD_EN;
  26. switch (pdata->phy_speed) {
  27. case SPEED_10:
  28. SET_REG_BITS(&mc2, INTF_MODE, 1);
  29. SET_REG_BITS(&intf_ctrl, HD_MODE, 0);
  30. SET_REG_BITS(&icm0, CFG_MACMODE, 0);
  31. SET_REG_BITS(&icm2, CFG_WAITASYNCRD, 500);
  32. SET_REG_BIT(&rgmii, CFG_SPEED_125, 0);
  33. break;
  34. case SPEED_100:
  35. SET_REG_BITS(&mc2, INTF_MODE, 1);
  36. SET_REG_BITS(&intf_ctrl, HD_MODE, 1);
  37. SET_REG_BITS(&icm0, CFG_MACMODE, 1);
  38. SET_REG_BITS(&icm2, CFG_WAITASYNCRD, 80);
  39. SET_REG_BIT(&rgmii, CFG_SPEED_125, 0);
  40. break;
  41. default:
  42. SET_REG_BITS(&mc2, INTF_MODE, 2);
  43. SET_REG_BITS(&intf_ctrl, HD_MODE, 2);
  44. SET_REG_BITS(&icm0, CFG_MACMODE, 2);
  45. SET_REG_BITS(&icm2, CFG_WAITASYNCRD, 16);
  46. SET_REG_BIT(&rgmii, CFG_SPEED_125, 1);
  47. break;
  48. }
  49. mc2 |= FULL_DUPLEX | CRC_EN | PAD_CRC;
  50. SET_REG_BITS(&ecm0, CFG_WFIFOFULLTHR, 0x32);
  51. xge_wr_csr(pdata, MAC_CONFIG_2, mc2);
  52. xge_wr_csr(pdata, INTERFACE_CONTROL, intf_ctrl);
  53. xge_wr_csr(pdata, RGMII_REG_0, rgmii);
  54. xge_wr_csr(pdata, ICM_CONFIG0_REG_0, icm0);
  55. xge_wr_csr(pdata, ICM_CONFIG2_REG_0, icm2);
  56. xge_wr_csr(pdata, ECM_CONFIG0_REG_0, ecm0);
  57. }
  58. void xge_mac_set_station_addr(struct xge_pdata *pdata)
  59. {
  60. const u8 *dev_addr = pdata->ndev->dev_addr;
  61. u32 addr0, addr1;
  62. addr0 = (dev_addr[3] << 24) | (dev_addr[2] << 16) |
  63. (dev_addr[1] << 8) | dev_addr[0];
  64. addr1 = (dev_addr[5] << 24) | (dev_addr[4] << 16);
  65. xge_wr_csr(pdata, STATION_ADDR0, addr0);
  66. xge_wr_csr(pdata, STATION_ADDR1, addr1);
  67. }
  68. void xge_mac_init(struct xge_pdata *pdata)
  69. {
  70. xge_mac_reset(pdata);
  71. xge_mac_set_speed(pdata);
  72. xge_mac_set_station_addr(pdata);
  73. }
  74. void xge_mac_enable(struct xge_pdata *pdata)
  75. {
  76. u32 data;
  77. data = xge_rd_csr(pdata, MAC_CONFIG_1);
  78. data |= TX_EN | RX_EN;
  79. xge_wr_csr(pdata, MAC_CONFIG_1, data);
  80. data = xge_rd_csr(pdata, MAC_CONFIG_1);
  81. }
  82. void xge_mac_disable(struct xge_pdata *pdata)
  83. {
  84. u32 data;
  85. data = xge_rd_csr(pdata, MAC_CONFIG_1);
  86. data &= ~(TX_EN | RX_EN);
  87. xge_wr_csr(pdata, MAC_CONFIG_1, data);
  88. }