1 // SPDX-License-Identifier: GPL-2.0
2 /* Marvell Octeon EP (EndPoint) Ethernet Driver
3 *
4 * Copyright (C) 2020 Marvell.
5 *
6 */
7 #include <linux/string.h>
8 #include <linux/types.h>
9 #include <linux/etherdevice.h>
10 #include <linux/pci.h>
11
12 #include "octep_config.h"
13 #include "octep_main.h"
14 #include "octep_ctrl_net.h"
15
octep_get_link_status(struct octep_device * oct)16 int octep_get_link_status(struct octep_device *oct)
17 {
18 struct octep_ctrl_net_h2f_req req = {};
19 struct octep_ctrl_net_h2f_resp *resp;
20 struct octep_ctrl_mbox_msg msg = {};
21 int err;
22
23 req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_LINK_STATUS;
24 req.link.cmd = OCTEP_CTRL_NET_CMD_GET;
25
26 msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
27 msg.hdr.sizew = OCTEP_CTRL_NET_H2F_STATE_REQ_SZW;
28 msg.msg = &req;
29 err = octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
30 if (err)
31 return err;
32
33 resp = (struct octep_ctrl_net_h2f_resp *)&req;
34 return resp->link.state;
35 }
36
octep_set_link_status(struct octep_device * oct,bool up)37 void octep_set_link_status(struct octep_device *oct, bool up)
38 {
39 struct octep_ctrl_net_h2f_req req = {};
40 struct octep_ctrl_mbox_msg msg = {};
41
42 req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_LINK_STATUS;
43 req.link.cmd = OCTEP_CTRL_NET_CMD_SET;
44 req.link.state = (up) ? OCTEP_CTRL_NET_STATE_UP : OCTEP_CTRL_NET_STATE_DOWN;
45
46 msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
47 msg.hdr.sizew = OCTEP_CTRL_NET_H2F_STATE_REQ_SZW;
48 msg.msg = &req;
49 octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
50 }
51
octep_set_rx_state(struct octep_device * oct,bool up)52 void octep_set_rx_state(struct octep_device *oct, bool up)
53 {
54 struct octep_ctrl_net_h2f_req req = {};
55 struct octep_ctrl_mbox_msg msg = {};
56
57 req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_RX_STATE;
58 req.link.cmd = OCTEP_CTRL_NET_CMD_SET;
59 req.link.state = (up) ? OCTEP_CTRL_NET_STATE_UP : OCTEP_CTRL_NET_STATE_DOWN;
60
61 msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
62 msg.hdr.sizew = OCTEP_CTRL_NET_H2F_STATE_REQ_SZW;
63 msg.msg = &req;
64 octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
65 }
66
octep_get_mac_addr(struct octep_device * oct,u8 * addr)67 int octep_get_mac_addr(struct octep_device *oct, u8 *addr)
68 {
69 struct octep_ctrl_net_h2f_req req = {};
70 struct octep_ctrl_net_h2f_resp *resp;
71 struct octep_ctrl_mbox_msg msg = {};
72 int err;
73
74 req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_MAC;
75 req.link.cmd = OCTEP_CTRL_NET_CMD_GET;
76
77 msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
78 msg.hdr.sizew = OCTEP_CTRL_NET_H2F_MAC_REQ_SZW;
79 msg.msg = &req;
80 err = octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
81 if (err)
82 return err;
83
84 resp = (struct octep_ctrl_net_h2f_resp *)&req;
85 memcpy(addr, resp->mac.addr, ETH_ALEN);
86
87 return err;
88 }
89
octep_set_mac_addr(struct octep_device * oct,u8 * addr)90 int octep_set_mac_addr(struct octep_device *oct, u8 *addr)
91 {
92 struct octep_ctrl_net_h2f_req req = {};
93 struct octep_ctrl_mbox_msg msg = {};
94
95 req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_MAC;
96 req.mac.cmd = OCTEP_CTRL_NET_CMD_SET;
97 memcpy(&req.mac.addr, addr, ETH_ALEN);
98
99 msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
100 msg.hdr.sizew = OCTEP_CTRL_NET_H2F_MAC_REQ_SZW;
101 msg.msg = &req;
102
103 return octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
104 }
105
octep_set_mtu(struct octep_device * oct,int mtu)106 int octep_set_mtu(struct octep_device *oct, int mtu)
107 {
108 struct octep_ctrl_net_h2f_req req = {};
109 struct octep_ctrl_mbox_msg msg = {};
110
111 req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_MTU;
112 req.mtu.cmd = OCTEP_CTRL_NET_CMD_SET;
113 req.mtu.val = mtu;
114
115 msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
116 msg.hdr.sizew = OCTEP_CTRL_NET_H2F_MTU_REQ_SZW;
117 msg.msg = &req;
118
119 return octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
120 }
121
octep_get_if_stats(struct octep_device * oct)122 int octep_get_if_stats(struct octep_device *oct)
123 {
124 void __iomem *iface_rx_stats;
125 void __iomem *iface_tx_stats;
126 struct octep_ctrl_net_h2f_req req = {};
127 struct octep_ctrl_mbox_msg msg = {};
128 int err;
129
130 req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_GET_IF_STATS;
131 req.mac.cmd = OCTEP_CTRL_NET_CMD_GET;
132 req.get_stats.offset = oct->ctrl_mbox_ifstats_offset;
133
134 msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
135 msg.hdr.sizew = OCTEP_CTRL_NET_H2F_GET_STATS_REQ_SZW;
136 msg.msg = &req;
137 err = octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
138 if (err)
139 return err;
140
141 iface_rx_stats = oct->ctrl_mbox.barmem + oct->ctrl_mbox_ifstats_offset;
142 iface_tx_stats = oct->ctrl_mbox.barmem + oct->ctrl_mbox_ifstats_offset +
143 sizeof(struct octep_iface_rx_stats);
144 memcpy_fromio(&oct->iface_rx_stats, iface_rx_stats, sizeof(struct octep_iface_rx_stats));
145 memcpy_fromio(&oct->iface_tx_stats, iface_tx_stats, sizeof(struct octep_iface_tx_stats));
146
147 return err;
148 }
149
octep_get_link_info(struct octep_device * oct)150 int octep_get_link_info(struct octep_device *oct)
151 {
152 struct octep_ctrl_net_h2f_req req = {};
153 struct octep_ctrl_net_h2f_resp *resp;
154 struct octep_ctrl_mbox_msg msg = {};
155 int err;
156
157 req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_LINK_INFO;
158 req.mac.cmd = OCTEP_CTRL_NET_CMD_GET;
159
160 msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
161 msg.hdr.sizew = OCTEP_CTRL_NET_H2F_LINK_INFO_REQ_SZW;
162 msg.msg = &req;
163 err = octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
164 if (err)
165 return err;
166
167 resp = (struct octep_ctrl_net_h2f_resp *)&req;
168 oct->link_info.supported_modes = resp->link_info.supported_modes;
169 oct->link_info.advertised_modes = resp->link_info.advertised_modes;
170 oct->link_info.autoneg = resp->link_info.autoneg;
171 oct->link_info.pause = resp->link_info.pause;
172 oct->link_info.speed = resp->link_info.speed;
173
174 return err;
175 }
176
octep_set_link_info(struct octep_device * oct,struct octep_iface_link_info * link_info)177 int octep_set_link_info(struct octep_device *oct, struct octep_iface_link_info *link_info)
178 {
179 struct octep_ctrl_net_h2f_req req = {};
180 struct octep_ctrl_mbox_msg msg = {};
181
182 req.hdr.cmd = OCTEP_CTRL_NET_H2F_CMD_LINK_INFO;
183 req.link_info.cmd = OCTEP_CTRL_NET_CMD_SET;
184 req.link_info.info.advertised_modes = link_info->advertised_modes;
185 req.link_info.info.autoneg = link_info->autoneg;
186 req.link_info.info.pause = link_info->pause;
187 req.link_info.info.speed = link_info->speed;
188
189 msg.hdr.flags = OCTEP_CTRL_MBOX_MSG_HDR_FLAG_REQ;
190 msg.hdr.sizew = OCTEP_CTRL_NET_H2F_LINK_INFO_REQ_SZW;
191 msg.msg = &req;
192
193 return octep_ctrl_mbox_send(&oct->ctrl_mbox, &msg);
194 }
195