dpmac.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /*
  2. * Freescale Layerscape MC I/O wrapper
  3. *
  4. * Copyright (C) 2015 Freescale Semiconductor, Inc.
  5. * Author: Prabhakar Kushwaha <prabhakar@freescale.com>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #include <fsl-mc/fsl_mc_sys.h>
  10. #include <fsl-mc/fsl_mc_cmd.h>
  11. #include <fsl-mc/fsl_dpmac.h>
  12. int dpmac_open(struct fsl_mc_io *mc_io,
  13. uint32_t cmd_flags,
  14. int dpmac_id,
  15. uint16_t *token)
  16. {
  17. struct mc_command cmd = { 0 };
  18. int err;
  19. /* prepare command */
  20. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_OPEN,
  21. cmd_flags,
  22. 0);
  23. DPMAC_CMD_OPEN(cmd, dpmac_id);
  24. /* send command to mc*/
  25. err = mc_send_command(mc_io, &cmd);
  26. if (err)
  27. return err;
  28. /* retrieve response parameters */
  29. *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
  30. return err;
  31. }
  32. int dpmac_close(struct fsl_mc_io *mc_io,
  33. uint32_t cmd_flags,
  34. uint16_t token)
  35. {
  36. struct mc_command cmd = { 0 };
  37. /* prepare command */
  38. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_CLOSE, cmd_flags,
  39. token);
  40. /* send command to mc*/
  41. return mc_send_command(mc_io, &cmd);
  42. }
  43. int dpmac_create(struct fsl_mc_io *mc_io,
  44. uint32_t cmd_flags,
  45. const struct dpmac_cfg *cfg,
  46. uint16_t *token)
  47. {
  48. struct mc_command cmd = { 0 };
  49. int err;
  50. /* prepare command */
  51. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_CREATE,
  52. cmd_flags,
  53. 0);
  54. DPMAC_CMD_CREATE(cmd, cfg);
  55. /* send command to mc*/
  56. err = mc_send_command(mc_io, &cmd);
  57. if (err)
  58. return err;
  59. /* retrieve response parameters */
  60. *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
  61. return 0;
  62. }
  63. int dpmac_destroy(struct fsl_mc_io *mc_io,
  64. uint32_t cmd_flags,
  65. uint16_t token)
  66. {
  67. struct mc_command cmd = { 0 };
  68. /* prepare command */
  69. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_DESTROY,
  70. cmd_flags,
  71. token);
  72. /* send command to mc*/
  73. return mc_send_command(mc_io, &cmd);
  74. }
  75. int dpmac_get_attributes(struct fsl_mc_io *mc_io,
  76. uint32_t cmd_flags,
  77. uint16_t token,
  78. struct dpmac_attr *attr)
  79. {
  80. struct mc_command cmd = { 0 };
  81. int err;
  82. /* prepare command */
  83. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_ATTR,
  84. cmd_flags,
  85. token);
  86. /* send command to mc*/
  87. err = mc_send_command(mc_io, &cmd);
  88. if (err)
  89. return err;
  90. /* retrieve response parameters */
  91. DPMAC_RSP_GET_ATTRIBUTES(cmd, attr);
  92. return 0;
  93. }
  94. int dpmac_mdio_read(struct fsl_mc_io *mc_io,
  95. uint32_t cmd_flags,
  96. uint16_t token,
  97. struct dpmac_mdio_cfg *cfg)
  98. {
  99. struct mc_command cmd = { 0 };
  100. int err;
  101. /* prepare command */
  102. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_MDIO_READ,
  103. cmd_flags,
  104. token);
  105. DPMAC_CMD_MDIO_READ(cmd, cfg);
  106. /* send command to mc*/
  107. err = mc_send_command(mc_io, &cmd);
  108. if (err)
  109. return err;
  110. /* retrieve response parameters */
  111. DPMAC_RSP_MDIO_READ(cmd, cfg->data);
  112. return 0;
  113. }
  114. int dpmac_mdio_write(struct fsl_mc_io *mc_io,
  115. uint32_t cmd_flags,
  116. uint16_t token,
  117. struct dpmac_mdio_cfg *cfg)
  118. {
  119. struct mc_command cmd = { 0 };
  120. /* prepare command */
  121. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_MDIO_WRITE,
  122. cmd_flags,
  123. token);
  124. DPMAC_CMD_MDIO_WRITE(cmd, cfg);
  125. /* send command to mc*/
  126. return mc_send_command(mc_io, &cmd);
  127. }
  128. int dpmac_get_link_cfg(struct fsl_mc_io *mc_io,
  129. uint32_t cmd_flags,
  130. uint16_t token,
  131. struct dpmac_link_cfg *cfg)
  132. {
  133. struct mc_command cmd = { 0 };
  134. int err = 0;
  135. /* prepare command */
  136. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_LINK_CFG,
  137. cmd_flags,
  138. token);
  139. /* send command to mc*/
  140. err = mc_send_command(mc_io, &cmd);
  141. if (err)
  142. return err;
  143. DPMAC_RSP_GET_LINK_CFG(cmd, cfg);
  144. return 0;
  145. }
  146. int dpmac_set_link_state(struct fsl_mc_io *mc_io,
  147. uint32_t cmd_flags,
  148. uint16_t token,
  149. struct dpmac_link_state *link_state)
  150. {
  151. struct mc_command cmd = { 0 };
  152. /* prepare command */
  153. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_SET_LINK_STATE,
  154. cmd_flags,
  155. token);
  156. DPMAC_CMD_SET_LINK_STATE(cmd, link_state);
  157. /* send command to mc*/
  158. return mc_send_command(mc_io, &cmd);
  159. }
  160. int dpmac_get_counter(struct fsl_mc_io *mc_io,
  161. uint32_t cmd_flags,
  162. uint16_t token,
  163. enum dpmac_counter type,
  164. uint64_t *counter)
  165. {
  166. struct mc_command cmd = { 0 };
  167. int err = 0;
  168. /* prepare command */
  169. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_COUNTER,
  170. cmd_flags,
  171. token);
  172. DPMAC_CMD_GET_COUNTER(cmd, type);
  173. /* send command to mc*/
  174. err = mc_send_command(mc_io, &cmd);
  175. if (err)
  176. return err;
  177. DPMAC_RSP_GET_COUNTER(cmd, *counter);
  178. return 0;
  179. }