xref: /OK3568_Linux_fs/u-boot/drivers/net/fsl-mc/dpmac.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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