xref: /linux/net/ethtool/cmis.h (revision 7f71507851fc7764b36a3221839607d3a45c2025)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #define ETHTOOL_CMIS_CDB_LPL_MAX_PL_LENGTH		120
4 #define ETHTOOL_CMIS_CDB_EPL_MAX_PL_LENGTH		2048
5 #define ETHTOOL_CMIS_CDB_CMD_PAGE			0x9F
6 #define ETHTOOL_CMIS_CDB_PAGE_I2C_ADDR			0x50
7 
8 /**
9  * struct ethtool_cmis_cdb - CDB commands parameters
10  * @cmis_rev: CMIS revision major.
11  * @read_write_len_ext: Allowable additional number of byte octets to the LPL
12  *			in a READ or a WRITE CDB commands.
13  * @max_completion_time:  Maximum CDB command completion time in msec.
14  */
15 struct ethtool_cmis_cdb {
16 	u8	cmis_rev;
17 	u8      read_write_len_ext;
18 	u16     max_completion_time;
19 };
20 
21 enum ethtool_cmis_cdb_cmd_id {
22 	ETHTOOL_CMIS_CDB_CMD_QUERY_STATUS		= 0x0000,
23 	ETHTOOL_CMIS_CDB_CMD_MODULE_FEATURES		= 0x0040,
24 	ETHTOOL_CMIS_CDB_CMD_FW_MANAGMENT_FEATURES	= 0x0041,
25 	ETHTOOL_CMIS_CDB_CMD_START_FW_DOWNLOAD		= 0x0101,
26 	ETHTOOL_CMIS_CDB_CMD_WRITE_FW_BLOCK_LPL		= 0x0103,
27 	ETHTOOL_CMIS_CDB_CMD_WRITE_FW_BLOCK_EPL		= 0x0104,
28 	ETHTOOL_CMIS_CDB_CMD_COMPLETE_FW_DOWNLOAD	= 0x0107,
29 	ETHTOOL_CMIS_CDB_CMD_RUN_FW_IMAGE		= 0x0109,
30 	ETHTOOL_CMIS_CDB_CMD_COMMIT_FW_IMAGE		= 0x010A,
31 };
32 
33 /**
34  * struct ethtool_cmis_cdb_request - CDB commands request fields as decribed in
35  *				the CMIS standard
36  * @id: Command ID.
37  * @epl_len: EPL memory length.
38  * @lpl_len: LPL memory length.
39  * @chk_code: Check code for the previous field and the payload.
40  * @resv1: Added to match the CMIS standard request continuity.
41  * @resv2: Added to match the CMIS standard request continuity.
42  * @payload: Payload for the CDB commands.
43  * @epl: Extended payload for the CDB commands.
44  */
45 struct ethtool_cmis_cdb_request {
46 	__be16 id;
47 	struct_group(body,
48 		__be16 epl_len;
49 		u8 lpl_len;
50 		u8 chk_code;
51 		u8 resv1;
52 		u8 resv2;
53 		u8 payload[ETHTOOL_CMIS_CDB_LPL_MAX_PL_LENGTH];
54 	);
55 	u8 *epl;	/* Everything above this field checksummed. */
56 };
57 
58 #define CDB_F_COMPLETION_VALID		BIT(0)
59 #define CDB_F_STATUS_VALID		BIT(1)
60 #define CDB_F_MODULE_STATE_VALID	BIT(2)
61 
62 /**
63  * struct ethtool_cmis_cdb_cmd_args - CDB commands execution arguments
64  * @req: CDB command fields as described in the CMIS standard.
65  * @max_duration: Maximum duration time for command completion in msec.
66  * @read_write_len_ext: Allowable additional number of byte octets to the LPL
67  *			in a READ or a WRITE commands.
68  * @msleep_pre_rpl: Waiting time before checking reply in msec.
69  * @rpl_exp_len: Expected reply length in bytes.
70  * @flags: Validation flags for CDB commands.
71  * @err_msg: Error message to be sent to user space.
72  */
73 struct ethtool_cmis_cdb_cmd_args {
74 	struct ethtool_cmis_cdb_request req;
75 	u16				max_duration;
76 	u8				read_write_len_ext;
77 	u8				msleep_pre_rpl;
78 	u8                              rpl_exp_len;
79 	u8				flags;
80 	char				*err_msg;
81 };
82 
83 /**
84  * struct ethtool_cmis_cdb_rpl_hdr - CDB commands reply header arguments
85  * @rpl_len: Reply length.
86  * @rpl_chk_code: Reply check code.
87  */
88 struct ethtool_cmis_cdb_rpl_hdr {
89 	u8 rpl_len;
90 	u8 rpl_chk_code;
91 };
92 
93 /**
94  * struct ethtool_cmis_cdb_rpl - CDB commands reply arguments
95  * @hdr: CDB commands reply header arguments.
96  * @payload: Payload for the CDB commands reply.
97  */
98 struct ethtool_cmis_cdb_rpl {
99 	struct ethtool_cmis_cdb_rpl_hdr hdr;
100 	u8 payload[ETHTOOL_CMIS_CDB_LPL_MAX_PL_LENGTH];
101 };
102 
103 u32 ethtool_cmis_get_max_lpl_size(u8 num_of_byte_octs);
104 u32 ethtool_cmis_get_max_epl_size(u8 num_of_byte_octs);
105 
106 void ethtool_cmis_cdb_compose_args(struct ethtool_cmis_cdb_cmd_args *args,
107 				   enum ethtool_cmis_cdb_cmd_id cmd, u8 *lpl,
108 				   u8 lpl_len, u8 *epl, u16 epl_len,
109 				   u16 max_duration, u8 read_write_len_ext,
110 				   u16 msleep_pre_rpl, u8 rpl_exp_len,
111 				   u8 flags);
112 
113 void ethtool_cmis_cdb_check_completion_flag(u8 cmis_rev, u8 *flags);
114 
115 void ethtool_cmis_page_init(struct ethtool_module_eeprom *page_data,
116 			    u8 page, u32 offset, u32 length);
117 
118 struct ethtool_cmis_cdb *
119 ethtool_cmis_cdb_init(struct net_device *dev,
120 		      const struct ethtool_module_fw_flash_params *params,
121 		      struct ethnl_module_fw_flash_ntf_params *ntf_params);
122 void ethtool_cmis_cdb_fini(struct ethtool_cmis_cdb *cdb);
123 
124 int ethtool_cmis_wait_for_cond(struct net_device *dev, u8 flags, u8 flag,
125 			       u16 max_duration, u32 offset,
126 			       bool (*cond_success)(u8), bool (*cond_fail)(u8), u8 *state);
127 
128 int ethtool_cmis_cdb_execute_cmd(struct net_device *dev,
129 				 struct ethtool_cmis_cdb_cmd_args *args);
130