1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Marvell Octeon EP (EndPoint) Ethernet Driver 3 * 4 * Copyright (C) 2020 Marvell. 5 * 6 */ 7 #ifndef __OCTEP_CTRL_NET_H__ 8 #define __OCTEP_CTRL_NET_H__ 9 10 #include "octep_cp_version.h" 11 12 #define OCTEP_CTRL_NET_INVALID_VFID (-1) 13 14 /* Supported commands */ 15 enum octep_ctrl_net_cmd { 16 OCTEP_CTRL_NET_CMD_GET = 0, 17 OCTEP_CTRL_NET_CMD_SET, 18 }; 19 20 /* Supported states */ 21 enum octep_ctrl_net_state { 22 OCTEP_CTRL_NET_STATE_DOWN = 0, 23 OCTEP_CTRL_NET_STATE_UP, 24 }; 25 26 /* Supported replies */ 27 enum octep_ctrl_net_reply { 28 OCTEP_CTRL_NET_REPLY_OK = 0, 29 OCTEP_CTRL_NET_REPLY_GENERIC_FAIL, 30 OCTEP_CTRL_NET_REPLY_INVALID_PARAM, 31 }; 32 33 /* Supported host to fw commands */ 34 enum octep_ctrl_net_h2f_cmd { 35 OCTEP_CTRL_NET_H2F_CMD_INVALID = 0, 36 OCTEP_CTRL_NET_H2F_CMD_MTU, 37 OCTEP_CTRL_NET_H2F_CMD_MAC, 38 OCTEP_CTRL_NET_H2F_CMD_GET_IF_STATS, 39 OCTEP_CTRL_NET_H2F_CMD_GET_XSTATS, 40 OCTEP_CTRL_NET_H2F_CMD_GET_Q_STATS, 41 OCTEP_CTRL_NET_H2F_CMD_LINK_STATUS, 42 OCTEP_CTRL_NET_H2F_CMD_RX_STATE, 43 OCTEP_CTRL_NET_H2F_CMD_LINK_INFO, 44 OCTEP_CTRL_NET_H2F_CMD_GET_INFO, 45 OCTEP_CTRL_NET_H2F_CMD_DEV_REMOVE, 46 OCTEP_CTRL_NET_H2F_CMD_OFFLOADS, 47 OCTEP_CTRL_NET_H2F_CMD_MAX 48 }; 49 50 /* Supported fw to host commands */ 51 enum octep_ctrl_net_f2h_cmd { 52 OCTEP_CTRL_NET_F2H_CMD_INVALID = 0, 53 OCTEP_CTRL_NET_F2H_CMD_LINK_STATUS, 54 OCTEP_CTRL_NET_F2H_CMD_MAX 55 }; 56 57 union octep_ctrl_net_req_hdr { 58 u64 words[1]; 59 struct { 60 /* sender id */ 61 u16 sender; 62 /* receiver id */ 63 u16 receiver; 64 /* octep_ctrl_net_h2t_cmd */ 65 u16 cmd; 66 /* reserved */ 67 u16 rsvd0; 68 } s; 69 }; 70 71 /* get/set mtu request */ 72 struct octep_ctrl_net_h2f_req_cmd_mtu { 73 /* enum octep_ctrl_net_cmd */ 74 u16 cmd; 75 /* 0-65535 */ 76 u16 val; 77 }; 78 79 /* get/set mac request */ 80 struct octep_ctrl_net_h2f_req_cmd_mac { 81 /* enum octep_ctrl_net_cmd */ 82 u16 cmd; 83 /* xx:xx:xx:xx:xx:xx */ 84 u8 addr[ETH_ALEN]; 85 }; 86 87 /* get/set link state, rx state */ 88 struct octep_ctrl_net_h2f_req_cmd_state { 89 /* enum octep_ctrl_net_cmd */ 90 u16 cmd; 91 /* enum octep_ctrl_net_state */ 92 u16 state; 93 }; 94 95 /* link info */ 96 struct octep_ctrl_net_link_info { 97 /* Bitmap of Supported link speeds/modes */ 98 u64 supported_modes; 99 /* Bitmap of Advertised link speeds/modes */ 100 u64 advertised_modes; 101 /* Autonegotation state; bit 0=disabled; bit 1=enabled */ 102 u8 autoneg; 103 /* Pause frames setting. bit 0=disabled; bit 1=enabled */ 104 u8 pause; 105 /* Negotiated link speed in Mbps */ 106 u32 speed; 107 }; 108 109 /* get/set link info */ 110 struct octep_ctrl_net_h2f_req_cmd_link_info { 111 /* enum octep_ctrl_net_cmd */ 112 u16 cmd; 113 /* struct octep_ctrl_net_link_info */ 114 struct octep_ctrl_net_link_info info; 115 }; 116 117 /* offloads */ 118 struct octep_ctrl_net_offloads { 119 /* supported rx offloads OCTEP_RX_OFFLOAD_* */ 120 u16 rx_offloads; 121 /* supported tx offloads OCTEP_TX_OFFLOAD_* */ 122 u16 tx_offloads; 123 /* reserved */ 124 u32 reserved_offloads; 125 /* extra offloads */ 126 u64 ext_offloads; 127 }; 128 129 /* get/set offloads */ 130 struct octep_ctrl_net_h2f_req_cmd_offloads { 131 /* enum octep_ctrl_net_cmd */ 132 u16 cmd; 133 /* struct octep_ctrl_net_offloads */ 134 struct octep_ctrl_net_offloads offloads; 135 }; 136 137 /* Host to fw request data */ 138 struct octep_ctrl_net_h2f_req { 139 union octep_ctrl_net_req_hdr hdr; 140 union { 141 struct octep_ctrl_net_h2f_req_cmd_mtu mtu; 142 struct octep_ctrl_net_h2f_req_cmd_mac mac; 143 struct octep_ctrl_net_h2f_req_cmd_state link; 144 struct octep_ctrl_net_h2f_req_cmd_state rx; 145 struct octep_ctrl_net_h2f_req_cmd_link_info link_info; 146 struct octep_ctrl_net_h2f_req_cmd_offloads offloads; 147 }; 148 } __packed; 149 150 union octep_ctrl_net_resp_hdr { 151 u64 words[1]; 152 struct { 153 /* sender id */ 154 u16 sender; 155 /* receiver id */ 156 u16 receiver; 157 /* octep_ctrl_net_h2t_cmd */ 158 u16 cmd; 159 /* octep_ctrl_net_reply */ 160 u16 reply; 161 } s; 162 }; 163 164 /* get mtu response */ 165 struct octep_ctrl_net_h2f_resp_cmd_mtu { 166 /* 0-65535 */ 167 u16 val; 168 }; 169 170 /* get mac response */ 171 struct octep_ctrl_net_h2f_resp_cmd_mac { 172 /* xx:xx:xx:xx:xx:xx */ 173 u8 addr[ETH_ALEN]; 174 }; 175 176 /* get if_stats, xstats, q_stats request */ 177 struct octep_ctrl_net_h2f_resp_cmd_get_stats { 178 struct octep_iface_rx_stats rx_stats; 179 struct octep_iface_tx_stats tx_stats; 180 }; 181 182 /* get link state, rx state response */ 183 struct octep_ctrl_net_h2f_resp_cmd_state { 184 /* enum octep_ctrl_net_state */ 185 u16 state; 186 }; 187 188 /* get info request */ 189 struct octep_ctrl_net_h2f_resp_cmd_get_info { 190 struct octep_fw_info fw_info; 191 }; 192 193 /* Host to fw response data */ 194 struct octep_ctrl_net_h2f_resp { 195 union octep_ctrl_net_resp_hdr hdr; 196 union { 197 struct octep_ctrl_net_h2f_resp_cmd_mtu mtu; 198 struct octep_ctrl_net_h2f_resp_cmd_mac mac; 199 struct octep_ctrl_net_h2f_resp_cmd_get_stats if_stats; 200 struct octep_ctrl_net_h2f_resp_cmd_state link; 201 struct octep_ctrl_net_h2f_resp_cmd_state rx; 202 struct octep_ctrl_net_link_info link_info; 203 struct octep_ctrl_net_h2f_resp_cmd_get_info info; 204 struct octep_ctrl_net_offloads offloads; 205 }; 206 } __packed; 207 208 /* link state notofication */ 209 struct octep_ctrl_net_f2h_req_cmd_state { 210 /* enum octep_ctrl_net_state */ 211 u16 state; 212 }; 213 214 /* Fw to host request data */ 215 struct octep_ctrl_net_f2h_req { 216 union octep_ctrl_net_req_hdr hdr; 217 union { 218 struct octep_ctrl_net_f2h_req_cmd_state link; 219 }; 220 }; 221 222 /* Fw to host response data */ 223 struct octep_ctrl_net_f2h_resp { 224 union octep_ctrl_net_resp_hdr hdr; 225 }; 226 227 /* Max data size to be transferred over mbox */ 228 union octep_ctrl_net_max_data { 229 struct octep_ctrl_net_h2f_req h2f_req; 230 struct octep_ctrl_net_h2f_resp h2f_resp; 231 struct octep_ctrl_net_f2h_req f2h_req; 232 struct octep_ctrl_net_f2h_resp f2h_resp; 233 }; 234 235 struct octep_ctrl_net_wait_data { 236 struct list_head list; 237 int done; 238 struct octep_ctrl_mbox_msg msg; 239 union { 240 struct octep_ctrl_net_h2f_req req; 241 struct octep_ctrl_net_h2f_resp resp; 242 } data; 243 }; 244 245 /** 246 * octep_ctrl_net_init() - Initialize data for ctrl net. 247 * 248 * @oct: non-null pointer to struct octep_device. 249 * 250 * return value: 0 on success, -errno on error. 251 */ 252 int octep_ctrl_net_init(struct octep_device *oct); 253 254 /** 255 * octep_ctrl_net_get_link_status() - Get link status from firmware. 256 * 257 * @oct: non-null pointer to struct octep_device. 258 * @vfid: Index of virtual function. 259 * 260 * return value: link status 0=down, 1=up. 261 */ 262 int octep_ctrl_net_get_link_status(struct octep_device *oct, int vfid); 263 264 /** 265 * octep_ctrl_net_set_link_status() - Set link status in firmware. 266 * 267 * @oct: non-null pointer to struct octep_device. 268 * @vfid: Index of virtual function. 269 * @up: boolean status. 270 * @wait_for_response: poll for response. 271 * 272 * return value: 0 on success, -errno on failure 273 */ 274 int octep_ctrl_net_set_link_status(struct octep_device *oct, int vfid, bool up, 275 bool wait_for_response); 276 277 /** 278 * octep_ctrl_net_set_rx_state() - Set rx state in firmware. 279 * 280 * @oct: non-null pointer to struct octep_device. 281 * @vfid: Index of virtual function. 282 * @up: boolean status. 283 * @wait_for_response: poll for response. 284 * 285 * return value: 0 on success, -errno on failure. 286 */ 287 int octep_ctrl_net_set_rx_state(struct octep_device *oct, int vfid, bool up, 288 bool wait_for_response); 289 290 /** 291 * octep_ctrl_net_get_mac_addr() - Get mac address from firmware. 292 * 293 * @oct: non-null pointer to struct octep_device. 294 * @vfid: Index of virtual function. 295 * @addr: non-null pointer to mac address. 296 * 297 * return value: 0 on success, -errno on failure. 298 */ 299 int octep_ctrl_net_get_mac_addr(struct octep_device *oct, int vfid, u8 *addr); 300 301 /** 302 * octep_ctrl_net_set_mac_addr() - Set mac address in firmware. 303 * 304 * @oct: non-null pointer to struct octep_device. 305 * @vfid: Index of virtual function. 306 * @addr: non-null pointer to mac address. 307 * @wait_for_response: poll for response. 308 * 309 * return value: 0 on success, -errno on failure. 310 */ 311 int octep_ctrl_net_set_mac_addr(struct octep_device *oct, int vfid, u8 *addr, 312 bool wait_for_response); 313 314 /** 315 * octep_ctrl_net_get_mtu() - Get max MTU from firmware. 316 * 317 * @oct: non-null pointer to struct octep_device. 318 * @vfid: Index of virtual function. 319 * 320 * return value: mtu on success, -errno on failure. 321 */ 322 int octep_ctrl_net_get_mtu(struct octep_device *oct, int vfid); 323 324 /** 325 * octep_ctrl_net_set_mtu() - Set mtu in firmware. 326 * 327 * @oct: non-null pointer to struct octep_device. 328 * @vfid: Index of virtual function. 329 * @mtu: mtu. 330 * @wait_for_response: poll for response. 331 * 332 * return value: 0 on success, -errno on failure. 333 */ 334 int octep_ctrl_net_set_mtu(struct octep_device *oct, int vfid, int mtu, 335 bool wait_for_response); 336 337 /** 338 * octep_ctrl_net_get_if_stats() - Get interface statistics from firmware. 339 * 340 * @oct: non-null pointer to struct octep_device. 341 * @vfid: Index of virtual function. 342 * @rx_stats: non-null pointer struct octep_iface_rx_stats. 343 * @tx_stats: non-null pointer struct octep_iface_tx_stats. 344 * 345 * return value: 0 on success, -errno on failure. 346 */ 347 int octep_ctrl_net_get_if_stats(struct octep_device *oct, int vfid, 348 struct octep_iface_rx_stats *rx_stats, 349 struct octep_iface_tx_stats *tx_stats); 350 351 /** 352 * octep_ctrl_net_get_link_info() - Get link info from firmware. 353 * 354 * @oct: non-null pointer to struct octep_device. 355 * @vfid: Index of virtual function. 356 * @link_info: non-null pointer to struct octep_iface_link_info. 357 * 358 * return value: 0 on success, -errno on failure. 359 */ 360 int octep_ctrl_net_get_link_info(struct octep_device *oct, int vfid, 361 struct octep_iface_link_info *link_info); 362 363 /** 364 * octep_ctrl_net_set_link_info() - Set link info in firmware. 365 * 366 * @oct: non-null pointer to struct octep_device. 367 * @vfid: Index of virtual function. 368 * @link_info: non-null pointer to struct octep_iface_link_info. 369 * @wait_for_response: poll for response. 370 * 371 * return value: 0 on success, -errno on failure. 372 */ 373 int octep_ctrl_net_set_link_info(struct octep_device *oct, 374 int vfid, 375 struct octep_iface_link_info *link_info, 376 bool wait_for_response); 377 378 /** 379 * octep_ctrl_net_recv_fw_messages() - Poll for firmware messages and process them. 380 * 381 * @oct: non-null pointer to struct octep_device. 382 */ 383 void octep_ctrl_net_recv_fw_messages(struct octep_device *oct); 384 385 /** 386 * octep_ctrl_net_get_info() - Get info from firmware. 387 * 388 * @oct: non-null pointer to struct octep_device. 389 * @vfid: Index of virtual function. 390 * @info: non-null pointer to struct octep_fw_info. 391 * 392 * return value: 0 on success, -errno on failure. 393 */ 394 int octep_ctrl_net_get_info(struct octep_device *oct, int vfid, 395 struct octep_fw_info *info); 396 397 /** 398 * octep_ctrl_net_dev_remove() - Indicate to firmware that a device unload has happened. 399 * 400 * @oct: non-null pointer to struct octep_device. 401 * @vfid: Index of virtual function. 402 * 403 * return value: 0 on success, -errno on failure. 404 */ 405 int octep_ctrl_net_dev_remove(struct octep_device *oct, int vfid); 406 407 /** 408 * octep_ctrl_net_set_offloads() - Set offloads in firmware. 409 * 410 * @oct: non-null pointer to struct octep_device. 411 * @vfid: Index of virtual function. 412 * @offloads: non-null pointer to struct octep_ctrl_net_offloads. 413 * @wait_for_response: poll for response. 414 * 415 * return value: 0 on success, -errno on failure. 416 */ 417 int octep_ctrl_net_set_offloads(struct octep_device *oct, int vfid, 418 struct octep_ctrl_net_offloads *offloads, 419 bool wait_for_response); 420 421 /** 422 * octep_ctrl_net_uninit() - Uninitialize data for ctrl net. 423 * 424 * @oct: non-null pointer to struct octep_device. 425 * 426 * return value: 0 on success, -errno on error. 427 */ 428 int octep_ctrl_net_uninit(struct octep_device *oct); 429 430 #endif /* __OCTEP_CTRL_NET_H__ */ 431