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); 125