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