Hi Kalle, On Tuesday 11 January 2022 18:14:05 CET Jerome Pouiller wrote: > From: Jérôme Pouiller <jerome.pouiller@xxxxxxxxxx> > > Signed-off-by: Jérôme Pouiller <jerome.pouiller@xxxxxxxxxx> > --- > drivers/net/wireless/silabs/wfx/main.c | 485 +++++++++++++++++++++++++ > drivers/net/wireless/silabs/wfx/main.h | 42 +++ > 2 files changed, 527 insertions(+) > create mode 100644 drivers/net/wireless/silabs/wfx/main.c > create mode 100644 drivers/net/wireless/silabs/wfx/main.h > [...] > +/* The device needs data about the antenna configuration. This information in > + * provided by PDS (Platform Data Set, this is the wording used in WF200 > + * documentation) files. For hardware integrators, the full process to create > + * PDS files is described here: > + * https:github.com/SiliconLabs/wfx-firmware/blob/master/PDS/README.md > + * > + * The PDS file is an array of Time-Length-Value structs. > + */ > + int wfx_send_pds(struct wfx_dev *wdev, u8 *buf, size_t len) > +{ > + int ret, chunk_type, chunk_len, chunk_num = 0; > + > + if (*buf == '{') { > + dev_err(wdev->dev, "PDS: malformed file (legacy format?)\n"); > + return -EINVAL; > + } > + while (len > 0) { > + chunk_type = get_unaligned_le16(buf + 0); > + chunk_len = get_unaligned_le16(buf + 2); > + if (chunk_len > len) { > + dev_err(wdev->dev, "PDS:%d: corrupted file\n", chunk_num); > + return -EINVAL; > + } > + if (chunk_type != WFX_PDS_TLV_TYPE) { > + dev_info(wdev->dev, "PDS:%d: skip unknown data\n", chunk_num); > + goto next; > + } > + if (chunk_len > WFX_PDS_MAX_CHUNK_SIZE) > + dev_warn(wdev->dev, "PDS:%d: unexpectly large chunk\n", chunk_num); > + if (buf[4] != '{' || buf[chunk_len - 1] != '}') > + dev_warn(wdev->dev, "PDS:%d: unexpected content\n", chunk_num); > + > + ret = wfx_hif_configuration(wdev, buf + 4, chunk_len - 4); > + if (ret > 0) { > + dev_err(wdev->dev, "PDS:%d: invalid data (unsupported options?)\n", > + chunk_num); > + return -EINVAL; > + } > + if (ret == -ETIMEDOUT) { > + dev_err(wdev->dev, "PDS:%d: chip didn't reply (corrupted file?)\n", > + chunk_num); > + return ret; > + } > + if (ret) { > + dev_err(wdev->dev, "PDS:%d: chip returned an unknown error\n", chunk_num); > + return -EIO; > + } > +next: > + chunk_num++; > + len -= chunk_len; > + buf += chunk_len; > + } > + return 0; > +} Kalle, is this function what you expected? If it is right for you, I am going to send it to the staging tree. -- Jérôme Pouiller