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