162306a36Sopenharmony_ci/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright (c) 2015-2018 Mellanox Technologies. All rights reserved */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef _MLXSW_EMAD_H
562306a36Sopenharmony_ci#define _MLXSW_EMAD_H
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#define MLXSW_EMAD_MAX_FRAME_LEN 1518	/* Length in u8 */
862306a36Sopenharmony_ci#define MLXSW_EMAD_MAX_RETRY 5
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/* EMAD Ethernet header */
1162306a36Sopenharmony_ci#define MLXSW_EMAD_ETH_HDR_LEN 0x10	/* Length in u8 */
1262306a36Sopenharmony_ci#define MLXSW_EMAD_EH_DMAC "\x01\x02\xc9\x00\x00\x01"
1362306a36Sopenharmony_ci#define MLXSW_EMAD_EH_SMAC "\x00\x02\xc9\x01\x02\x03"
1462306a36Sopenharmony_ci#define MLXSW_EMAD_EH_ETHERTYPE 0x8932
1562306a36Sopenharmony_ci#define MLXSW_EMAD_EH_MLX_PROTO 0
1662306a36Sopenharmony_ci#define MLXSW_EMAD_EH_PROTO_VERSION 0
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/* EMAD TLV Types */
1962306a36Sopenharmony_cienum {
2062306a36Sopenharmony_ci	MLXSW_EMAD_TLV_TYPE_END,
2162306a36Sopenharmony_ci	MLXSW_EMAD_TLV_TYPE_OP,
2262306a36Sopenharmony_ci	MLXSW_EMAD_TLV_TYPE_STRING,
2362306a36Sopenharmony_ci	MLXSW_EMAD_TLV_TYPE_REG,
2462306a36Sopenharmony_ci	MLXSW_EMAD_TLV_TYPE_LATENCY,
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/* OP TLV */
2862306a36Sopenharmony_ci#define MLXSW_EMAD_OP_TLV_LEN 4		/* Length in u32 */
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cienum {
3162306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_CLASS_REG_ACCESS = 1,
3262306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_CLASS_IPC = 2,
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cienum mlxsw_emad_op_tlv_status {
3662306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_STATUS_SUCCESS,
3762306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_STATUS_BUSY,
3862306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_STATUS_VERSION_NOT_SUPPORTED,
3962306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_STATUS_UNKNOWN_TLV,
4062306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_STATUS_REGISTER_NOT_SUPPORTED,
4162306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_STATUS_CLASS_NOT_SUPPORTED,
4262306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_STATUS_METHOD_NOT_SUPPORTED,
4362306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_STATUS_BAD_PARAMETER,
4462306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_STATUS_RESOURCE_NOT_AVAILABLE,
4562306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_STATUS_MESSAGE_RECEIPT_ACK,
4662306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_STATUS_INTERNAL_ERROR = 0x70,
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistatic inline char *mlxsw_emad_op_tlv_status_str(u8 status)
5062306a36Sopenharmony_ci{
5162306a36Sopenharmony_ci	switch (status) {
5262306a36Sopenharmony_ci	case MLXSW_EMAD_OP_TLV_STATUS_SUCCESS:
5362306a36Sopenharmony_ci		return "operation performed";
5462306a36Sopenharmony_ci	case MLXSW_EMAD_OP_TLV_STATUS_BUSY:
5562306a36Sopenharmony_ci		return "device is busy";
5662306a36Sopenharmony_ci	case MLXSW_EMAD_OP_TLV_STATUS_VERSION_NOT_SUPPORTED:
5762306a36Sopenharmony_ci		return "version not supported";
5862306a36Sopenharmony_ci	case MLXSW_EMAD_OP_TLV_STATUS_UNKNOWN_TLV:
5962306a36Sopenharmony_ci		return "unknown TLV";
6062306a36Sopenharmony_ci	case MLXSW_EMAD_OP_TLV_STATUS_REGISTER_NOT_SUPPORTED:
6162306a36Sopenharmony_ci		return "register not supported";
6262306a36Sopenharmony_ci	case MLXSW_EMAD_OP_TLV_STATUS_CLASS_NOT_SUPPORTED:
6362306a36Sopenharmony_ci		return "class not supported";
6462306a36Sopenharmony_ci	case MLXSW_EMAD_OP_TLV_STATUS_METHOD_NOT_SUPPORTED:
6562306a36Sopenharmony_ci		return "method not supported";
6662306a36Sopenharmony_ci	case MLXSW_EMAD_OP_TLV_STATUS_BAD_PARAMETER:
6762306a36Sopenharmony_ci		return "bad parameter";
6862306a36Sopenharmony_ci	case MLXSW_EMAD_OP_TLV_STATUS_RESOURCE_NOT_AVAILABLE:
6962306a36Sopenharmony_ci		return "resource not available";
7062306a36Sopenharmony_ci	case MLXSW_EMAD_OP_TLV_STATUS_MESSAGE_RECEIPT_ACK:
7162306a36Sopenharmony_ci		return "acknowledged. retransmit";
7262306a36Sopenharmony_ci	case MLXSW_EMAD_OP_TLV_STATUS_INTERNAL_ERROR:
7362306a36Sopenharmony_ci		return "internal error";
7462306a36Sopenharmony_ci	default:
7562306a36Sopenharmony_ci		return "*UNKNOWN*";
7662306a36Sopenharmony_ci	}
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cienum {
8062306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_REQUEST,
8162306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_RESPONSE
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cienum {
8562306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_METHOD_QUERY = 1,
8662306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_METHOD_WRITE = 2,
8762306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_METHOD_SEND = 3,
8862306a36Sopenharmony_ci	MLXSW_EMAD_OP_TLV_METHOD_EVENT = 5,
8962306a36Sopenharmony_ci};
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/* STRING TLV */
9262306a36Sopenharmony_ci#define MLXSW_EMAD_STRING_TLV_LEN 33	/* Length in u32 */
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/* LATENCY TLV */
9562306a36Sopenharmony_ci#define MLXSW_EMAD_LATENCY_TLV_LEN 7	/* Length in u32 */
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci/* END TLV */
9862306a36Sopenharmony_ci#define MLXSW_EMAD_END_TLV_LEN 1	/* Length in u32 */
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci#endif
101