mac.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * Applied Micro X-Gene SoC Ethernet v2 Driver
  3. *
  4. * Copyright (c) 2017, Applied Micro Circuits Corporation
  5. * Author(s): Iyappan Subramanian <isubramanian@apm.com>
  6. * Keyur Chudgar <kchudgar@apm.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License as published by the
  10. * Free Software Foundation; either version 2 of the License, or (at your
  11. * option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. */
  21. #include "main.h"
  22. void xge_mac_reset(struct xge_pdata *pdata)
  23. {
  24. xge_wr_csr(pdata, MAC_CONFIG_1, SOFT_RESET);
  25. xge_wr_csr(pdata, MAC_CONFIG_1, 0);
  26. }
  27. void xge_mac_set_speed(struct xge_pdata *pdata)
  28. {
  29. u32 icm0, icm2, ecm0, mc2;
  30. u32 intf_ctrl, rgmii;
  31. icm0 = xge_rd_csr(pdata, ICM_CONFIG0_REG_0);
  32. icm2 = xge_rd_csr(pdata, ICM_CONFIG2_REG_0);
  33. ecm0 = xge_rd_csr(pdata, ECM_CONFIG0_REG_0);
  34. rgmii = xge_rd_csr(pdata, RGMII_REG_0);
  35. mc2 = xge_rd_csr(pdata, MAC_CONFIG_2);
  36. intf_ctrl = xge_rd_csr(pdata, INTERFACE_CONTROL);
  37. icm2 |= CFG_WAITASYNCRD_EN;
  38. switch (pdata->phy_speed) {
  39. case SPEED_10:
  40. SET_REG_BITS(&mc2, INTF_MODE, 1);
  41. SET_REG_BITS(&intf_ctrl, HD_MODE, 0);
  42. SET_REG_BITS(&icm0, CFG_MACMODE, 0);
  43. SET_REG_BITS(&icm2, CFG_WAITASYNCRD, 500);
  44. SET_REG_BIT(&rgmii, CFG_SPEED_125, 0);
  45. break;
  46. case SPEED_100:
  47. SET_REG_BITS(&mc2, INTF_MODE, 1);
  48. SET_REG_BITS(&intf_ctrl, HD_MODE, 1);
  49. SET_REG_BITS(&icm0, CFG_MACMODE, 1);
  50. SET_REG_BITS(&icm2, CFG_WAITASYNCRD, 80);
  51. SET_REG_BIT(&rgmii, CFG_SPEED_125, 0);
  52. break;
  53. default:
  54. SET_REG_BITS(&mc2, INTF_MODE, 2);
  55. SET_REG_BITS(&intf_ctrl, HD_MODE, 2);
  56. SET_REG_BITS(&icm0, CFG_MACMODE, 2);
  57. SET_REG_BITS(&icm2, CFG_WAITASYNCRD, 16);
  58. SET_REG_BIT(&rgmii, CFG_SPEED_125, 1);
  59. break;
  60. }
  61. mc2 |= FULL_DUPLEX | CRC_EN | PAD_CRC;
  62. SET_REG_BITS(&ecm0, CFG_WFIFOFULLTHR, 0x32);
  63. xge_wr_csr(pdata, MAC_CONFIG_2, mc2);
  64. xge_wr_csr(pdata, INTERFACE_CONTROL, intf_ctrl);
  65. xge_wr_csr(pdata, RGMII_REG_0, rgmii);
  66. xge_wr_csr(pdata, ICM_CONFIG0_REG_0, icm0);
  67. xge_wr_csr(pdata, ICM_CONFIG2_REG_0, icm2);
  68. xge_wr_csr(pdata, ECM_CONFIG0_REG_0, ecm0);
  69. }
  70. void xge_mac_set_station_addr(struct xge_pdata *pdata)
  71. {
  72. u8 *dev_addr = pdata->ndev->dev_addr;
  73. u32 addr0, addr1;
  74. addr0 = (dev_addr[3] << 24) | (dev_addr[2] << 16) |
  75. (dev_addr[1] << 8) | dev_addr[0];
  76. addr1 = (dev_addr[5] << 24) | (dev_addr[4] << 16);
  77. xge_wr_csr(pdata, STATION_ADDR0, addr0);
  78. xge_wr_csr(pdata, STATION_ADDR1, addr1);
  79. }
  80. void xge_mac_init(struct xge_pdata *pdata)
  81. {
  82. xge_mac_reset(pdata);
  83. xge_mac_set_speed(pdata);
  84. xge_mac_set_station_addr(pdata);
  85. }
  86. void xge_mac_enable(struct xge_pdata *pdata)
  87. {
  88. u32 data;
  89. data = xge_rd_csr(pdata, MAC_CONFIG_1);
  90. data |= TX_EN | RX_EN;
  91. xge_wr_csr(pdata, MAC_CONFIG_1, data);
  92. data = xge_rd_csr(pdata, MAC_CONFIG_1);
  93. }
  94. void xge_mac_disable(struct xge_pdata *pdata)
  95. {
  96. u32 data;
  97. data = xge_rd_csr(pdata, MAC_CONFIG_1);
  98. data &= ~(TX_EN | RX_EN);
  99. xge_wr_csr(pdata, MAC_CONFIG_1, data);
  100. }