Skip to content

Commit 2567daa

Browse files
brettcreeleykuba-moo
authored andcommitted
pds_core: handle unsupported PDS_CORE_CMD_FW_CONTROL result
If the FW doesn't support the PDS_CORE_CMD_FW_CONTROL command the driver might at the least print garbage and at the worst crash when the user runs the "devlink dev info" devlink command. This happens because the stack variable fw_list is not 0 initialized which results in fw_list.num_fw_slots being a garbage value from the stack. Then the driver tries to access fw_list.fw_names[i] with i >= ARRAY_SIZE and runs off the end of the array. Fix this by initializing the fw_list and by not failing completely if the devcmd fails because other useful information is printed via devlink dev info even if the devcmd fails. Fixes: 45d76f4 ("pds_core: set up device and adminq") Signed-off-by: Brett Creeley <brett.creeley@amd.com> Reviewed-by: Simon Horman <horms@kernel.org> Signed-off-by: Shannon Nelson <shannon.nelson@amd.com> Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Link: https://patch.msgid.link/20250421174606.3892-3-shannon.nelson@amd.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent d9e2f07 commit 2567daa

File tree

1 file changed

+1
-3
lines changed

1 file changed

+1
-3
lines changed

drivers/net/ethernet/amd/pds_core/devlink.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ int pdsc_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
105105
.fw_control.opcode = PDS_CORE_CMD_FW_CONTROL,
106106
.fw_control.oper = PDS_CORE_FW_GET_LIST,
107107
};
108-
struct pds_core_fw_list_info fw_list;
108+
struct pds_core_fw_list_info fw_list = {};
109109
struct pdsc *pdsc = devlink_priv(dl);
110110
union pds_core_dev_comp comp;
111111
char buf[32];
@@ -118,8 +118,6 @@ int pdsc_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
118118
if (!err)
119119
memcpy_fromio(&fw_list, pdsc->cmd_regs->data, sizeof(fw_list));
120120
mutex_unlock(&pdsc->devcmd_lock);
121-
if (err && err != -EIO)
122-
return err;
123121

124122
listlen = min(fw_list.num_fw_slots, ARRAY_SIZE(fw_list.fw_names));
125123
for (i = 0; i < listlen; i++) {

0 commit comments

Comments
 (0)