dpmac.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Freescale Layerscape MC I/O wrapper
  4. *
  5. * Copyright 2015-2016 Freescale Semiconductor, Inc.
  6. * Copyright 2017 NXP
  7. * Author: Prabhakar Kushwaha <prabhakar@freescale.com>
  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. uint16_t dprc_token,
  45. uint32_t cmd_flags,
  46. const struct dpmac_cfg *cfg,
  47. uint32_t *obj_id)
  48. {
  49. struct mc_command cmd = { 0 };
  50. int err;
  51. /* prepare command */
  52. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_CREATE,
  53. cmd_flags,
  54. dprc_token);
  55. DPMAC_CMD_CREATE(cmd, cfg);
  56. /* send command to mc*/
  57. err = mc_send_command(mc_io, &cmd);
  58. if (err)
  59. return err;
  60. /* retrieve response parameters */
  61. MC_CMD_READ_OBJ_ID(cmd, *obj_id);
  62. return 0;
  63. }
  64. int dpmac_destroy(struct fsl_mc_io *mc_io,
  65. uint16_t dprc_token,
  66. uint32_t cmd_flags,
  67. uint32_t obj_id)
  68. {
  69. struct mc_command cmd = { 0 };
  70. /* prepare command */
  71. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_DESTROY,
  72. cmd_flags,
  73. dprc_token);
  74. /* set object id to destroy */
  75. CMD_DESTROY_SET_OBJ_ID_PARAM0(cmd, obj_id);
  76. /* send command to mc*/
  77. return mc_send_command(mc_io, &cmd);
  78. }
  79. int dpmac_get_attributes(struct fsl_mc_io *mc_io,
  80. uint32_t cmd_flags,
  81. uint16_t token,
  82. struct dpmac_attr *attr)
  83. {
  84. struct mc_command cmd = { 0 };
  85. int err;
  86. /* prepare command */
  87. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_ATTR,
  88. cmd_flags,
  89. token);
  90. /* send command to mc*/
  91. err = mc_send_command(mc_io, &cmd);
  92. if (err)
  93. return err;
  94. /* retrieve response parameters */
  95. DPMAC_RSP_GET_ATTRIBUTES(cmd, attr);
  96. return 0;
  97. }
  98. int dpmac_mdio_read(struct fsl_mc_io *mc_io,
  99. uint32_t cmd_flags,
  100. uint16_t token,
  101. struct dpmac_mdio_cfg *cfg)
  102. {
  103. struct mc_command cmd = { 0 };
  104. int err;
  105. /* prepare command */
  106. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_MDIO_READ,
  107. cmd_flags,
  108. token);
  109. DPMAC_CMD_MDIO_READ(cmd, cfg);
  110. /* send command to mc*/
  111. err = mc_send_command(mc_io, &cmd);
  112. if (err)
  113. return err;
  114. /* retrieve response parameters */
  115. DPMAC_RSP_MDIO_READ(cmd, cfg->data);
  116. return 0;
  117. }
  118. int dpmac_mdio_write(struct fsl_mc_io *mc_io,
  119. uint32_t cmd_flags,
  120. uint16_t token,
  121. struct dpmac_mdio_cfg *cfg)
  122. {
  123. struct mc_command cmd = { 0 };
  124. /* prepare command */
  125. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_MDIO_WRITE,
  126. cmd_flags,
  127. token);
  128. DPMAC_CMD_MDIO_WRITE(cmd, cfg);
  129. /* send command to mc*/
  130. return mc_send_command(mc_io, &cmd);
  131. }
  132. int dpmac_get_link_cfg(struct fsl_mc_io *mc_io,
  133. uint32_t cmd_flags,
  134. uint16_t token,
  135. struct dpmac_link_cfg *cfg)
  136. {
  137. struct mc_command cmd = { 0 };
  138. int err = 0;
  139. /* prepare command */
  140. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_LINK_CFG,
  141. cmd_flags,
  142. token);
  143. /* send command to mc*/
  144. err = mc_send_command(mc_io, &cmd);
  145. if (err)
  146. return err;
  147. DPMAC_RSP_GET_LINK_CFG(cmd, cfg);
  148. return 0;
  149. }
  150. int dpmac_set_link_state(struct fsl_mc_io *mc_io,
  151. uint32_t cmd_flags,
  152. uint16_t token,
  153. struct dpmac_link_state *link_state)
  154. {
  155. struct mc_command cmd = { 0 };
  156. /* prepare command */
  157. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_SET_LINK_STATE,
  158. cmd_flags,
  159. token);
  160. DPMAC_CMD_SET_LINK_STATE(cmd, link_state);
  161. /* send command to mc*/
  162. return mc_send_command(mc_io, &cmd);
  163. }
  164. int dpmac_get_counter(struct fsl_mc_io *mc_io,
  165. uint32_t cmd_flags,
  166. uint16_t token,
  167. enum dpmac_counter type,
  168. uint64_t *counter)
  169. {
  170. struct mc_command cmd = { 0 };
  171. int err = 0;
  172. /* prepare command */
  173. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_COUNTER,
  174. cmd_flags,
  175. token);
  176. DPMAC_CMD_GET_COUNTER(cmd, type);
  177. /* send command to mc*/
  178. err = mc_send_command(mc_io, &cmd);
  179. if (err)
  180. return err;
  181. DPMAC_RSP_GET_COUNTER(cmd, *counter);
  182. return 0;
  183. }
  184. int dpmac_get_api_version(struct fsl_mc_io *mc_io,
  185. u32 cmd_flags,
  186. u16 *major_ver,
  187. u16 *minor_ver)
  188. {
  189. struct mc_command cmd = { 0 };
  190. int err;
  191. /* prepare command */
  192. cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_API_VERSION,
  193. cmd_flags, 0);
  194. /* send command to mc */
  195. err = mc_send_command(mc_io, &cmd);
  196. if (err)
  197. return err;
  198. /* retrieve response parameters */
  199. mc_cmd_read_api_version(&cmd, major_ver, minor_ver);
  200. return 0;
  201. }