2024-06-27 14:08:51 +00:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
|
|
|
|
#include <uapi/linux/ethtool.h>
|
|
|
|
|
|
|
|
/**
|
|
|
|
* struct ethnl_module_fw_flash_ntf_params - module firmware flashing
|
|
|
|
* notifications parameters
|
|
|
|
* @portid: Netlink portid of sender.
|
|
|
|
* @seq: Sequence number of sender.
|
|
|
|
* @closed_sock: Indicates whether the socket was closed from user space.
|
|
|
|
*/
|
|
|
|
struct ethnl_module_fw_flash_ntf_params {
|
|
|
|
u32 portid;
|
|
|
|
u32 seq;
|
|
|
|
bool closed_sock;
|
|
|
|
};
|
|
|
|
|
ethtool: cmis_cdb: Add a layer for supporting CDB commands
CDB (Command Data Block Message Communication) reads and writes are
performed on memory map pages 9Fh-AFh according to the CMIS standard,
section 8.20 of revision 5.2.
Page 9Fh is used to specify the CDB command to be executed and also
provides an area for a local payload (LPL).
According to the CMIS standard, the firmware update process is done using
a CDB commands sequence that will be implemented in the next patch.
The kernel interface that will implement the firmware update using CDB
command will include 2 layers that will be added under ethtool:
* The upper layer that will be triggered from the module layer, is
cmis_fw_update.
* The lower one is cmis_cdb.
In the future there might be more operations to implement using CDB
commands. Therefore, the idea is to keep the CDB interface clean and the
cmis_fw_update specific to the CDB commands handling it.
These two layers will communicate using the API the consists of three
functions:
- struct ethtool_cmis_cdb *
ethtool_cmis_cdb_init(struct net_device *dev,
struct ethtool_module_fw_flash_params *params);
- void ethtool_cmis_cdb_fini(struct ethtool_cmis_cdb *cdb);
- int ethtool_cmis_cdb_execute_cmd(struct net_device *dev,
struct ethtool_cmis_cdb_cmd_args *args);
Add the CDB layer to support initializing, finishing and executing CDB
commands:
* The initialization process will include creating of an ethtool_cmis_cdb
instance, querying the module CDB support, entering and validating the
password from user space (CMD 0x0000) and querying the module features
(CMD 0x0040).
* The finishing API will simply free the ethtool_cmis_cdb instance.
* The executing process will write the CDB command to EEPROM using
set_module_eeprom_by_page() that was presented earlier, and will
process the reply from EEPROM.
Signed-off-by: Danielle Ratson <danieller@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2024-06-27 14:08:54 +00:00
|
|
|
/**
|
|
|
|
* struct ethtool_module_fw_flash_params - module firmware flashing parameters
|
|
|
|
* @password: Module password. Only valid when @pass_valid is set.
|
|
|
|
* @password_valid: Whether the module password is valid or not.
|
|
|
|
*/
|
|
|
|
struct ethtool_module_fw_flash_params {
|
|
|
|
__be32 password;
|
|
|
|
u8 password_valid:1;
|
|
|
|
};
|
|
|
|
|
2024-06-27 14:08:55 +00:00
|
|
|
/**
|
|
|
|
* struct ethtool_cmis_fw_update_params - CMIS firmware update specific
|
|
|
|
* parameters
|
|
|
|
* @dev: Pointer to the net_device to be flashed.
|
|
|
|
* @params: Module firmware flashing parameters.
|
|
|
|
* @ntf_params: Module firmware flashing notification parameters.
|
|
|
|
* @fw: Firmware to flash.
|
|
|
|
*/
|
|
|
|
struct ethtool_cmis_fw_update_params {
|
|
|
|
struct net_device *dev;
|
|
|
|
struct ethtool_module_fw_flash_params params;
|
|
|
|
struct ethnl_module_fw_flash_ntf_params ntf_params;
|
|
|
|
const struct firmware *fw;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* struct ethtool_module_fw_flash - module firmware flashing
|
|
|
|
* @list: List node for &module_fw_flash_work_list.
|
|
|
|
* @dev_tracker: Refcount tracker for @dev.
|
|
|
|
* @work: The flashing firmware work.
|
|
|
|
* @fw_update: CMIS firmware update specific parameters.
|
|
|
|
*/
|
|
|
|
struct ethtool_module_fw_flash {
|
|
|
|
struct list_head list;
|
|
|
|
netdevice_tracker dev_tracker;
|
|
|
|
struct work_struct work;
|
|
|
|
struct ethtool_cmis_fw_update_params fw_update;
|
|
|
|
};
|
|
|
|
|
2024-06-27 14:08:51 +00:00
|
|
|
void
|
|
|
|
ethnl_module_fw_flash_ntf_err(struct net_device *dev,
|
|
|
|
struct ethnl_module_fw_flash_ntf_params *params,
|
|
|
|
char *err_msg, char *sub_err_msg);
|
|
|
|
void
|
|
|
|
ethnl_module_fw_flash_ntf_start(struct net_device *dev,
|
|
|
|
struct ethnl_module_fw_flash_ntf_params *params);
|
|
|
|
void
|
|
|
|
ethnl_module_fw_flash_ntf_complete(struct net_device *dev,
|
|
|
|
struct ethnl_module_fw_flash_ntf_params *params);
|
|
|
|
void
|
|
|
|
ethnl_module_fw_flash_ntf_in_progress(struct net_device *dev,
|
|
|
|
struct ethnl_module_fw_flash_ntf_params *params,
|
|
|
|
u64 done, u64 total);
|
2024-06-27 14:08:55 +00:00
|
|
|
|
|
|
|
void ethtool_cmis_fw_update(struct ethtool_cmis_fw_update_params *params);
|