Commit 6bb03c21 authored by Karol Trzcinski's avatar Karol Trzcinski Committed by Mark Brown

ASoC: SOF: loader: fix snd_sof_fw_parse_ext_data

An error occurs during parsing more than one ext_data from the mailbox, because
of invalid data offset handling. Fix by removing the incorrect duplicate
increment of the offset.

The return value is also reset in the switch case. This does not change the
behavior but improves readability - there is no longer a need to check what the
return value of get_ext_windows is.
Signed-off-by: default avatarKarol Trzcinski <karolx.trzcinski@linux.intel.com>
Signed-off-by: default avatarBartosz Kokoszko <bartoszx.kokoszko@linux.intel.com>
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20191210004854.16845-4-pierre-louis.bossart@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 8edc9566
...@@ -50,8 +50,7 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset) ...@@ -50,8 +50,7 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset)
while (ext_hdr->hdr.cmd == SOF_IPC_FW_READY) { while (ext_hdr->hdr.cmd == SOF_IPC_FW_READY) {
/* read in ext structure */ /* read in ext structure */
offset += sizeof(*ext_hdr); snd_sof_dsp_block_read(sdev, bar, offset + sizeof(*ext_hdr),
snd_sof_dsp_block_read(sdev, bar, offset,
(void *)((u8 *)ext_data + sizeof(*ext_hdr)), (void *)((u8 *)ext_data + sizeof(*ext_hdr)),
ext_hdr->hdr.size - sizeof(*ext_hdr)); ext_hdr->hdr.size - sizeof(*ext_hdr));
...@@ -61,6 +60,7 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset) ...@@ -61,6 +60,7 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset)
/* process structure data */ /* process structure data */
switch (ext_hdr->type) { switch (ext_hdr->type) {
case SOF_IPC_EXT_DMA_BUFFER: case SOF_IPC_EXT_DMA_BUFFER:
ret = 0;
break; break;
case SOF_IPC_EXT_WINDOW: case SOF_IPC_EXT_WINDOW:
ret = get_ext_windows(sdev, ext_hdr); ret = get_ext_windows(sdev, ext_hdr);
...@@ -68,6 +68,7 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset) ...@@ -68,6 +68,7 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset)
default: default:
dev_warn(sdev->dev, "warning: unknown ext header type %d size 0x%x\n", dev_warn(sdev->dev, "warning: unknown ext header type %d size 0x%x\n",
ext_hdr->type, ext_hdr->hdr.size); ext_hdr->type, ext_hdr->hdr.size);
ret = 0;
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment