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