| 1 |
|
| 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;
|
| 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 | * @msleep_pre_rpl: Waiting time before checking reply in msec.
|
| 67 | * @read_write_len_ext: Allowable additional number of byte octets to the LPL
|
| 68 | * in a READ or a WRITE commands.
|
| 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 | u16 msleep_pre_rpl;
|
| 77 | u8 read_write_len_ext;
|
| 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 |
|
| 105 | void ethtool_cmis_cdb_compose_args(struct ethtool_cmis_cdb_cmd_args *args,
|
| 106 | enum ethtool_cmis_cdb_cmd_id cmd, u8 *lpl,
|
| 107 | u8 lpl_len, u8 *epl, u16 epl_len,
|
| 108 | u16 max_duration, u8 read_write_len_ext,
|
| 109 | u16 msleep_pre_rpl, u8 rpl_exp_len,
|
| 110 | u8 flags);
|
| 111 |
|
| 112 | void ethtool_cmis_cdb_check_completion_flag(u8 cmis_rev, u8 *flags);
|
| 113 |
|
| 114 | void ethtool_cmis_page_init(struct ethtool_module_eeprom *page_data,
|
| 115 | u8 page, u32 offset, u32 length);
|
| 116 |
|
| 117 | struct ethtool_cmis_cdb *
|
| 118 | ethtool_cmis_cdb_init(struct net_device *dev,
|
| 119 | const struct ethtool_module_fw_flash_params *params,
|
| 120 | struct ethnl_module_fw_flash_ntf_params *ntf_params);
|
| 121 | void ethtool_cmis_cdb_fini(struct ethtool_cmis_cdb *cdb);
|
| 122 |
|
| 123 | int ethtool_cmis_wait_for_cond(struct net_device *dev, u8 flags, u8 flag,
|
| 124 | u16 max_duration, u32 offset,
|
| 125 | bool (*cond_success)(u8), bool (*cond_fail)(u8), u8 *state);
|
| 126 |
|
| 127 | int ethtool_cmis_cdb_execute_cmd(struct net_device *dev,
|
| 128 | struct ethtool_cmis_cdb_cmd_args *args);
|