dpmac.c 5.0 KB

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