From: Yang Li User-space applications (e.g., PipeWire) depend on ISO-formatted timestamps for precise audio sync. Signed-off-by: Yang Li --- Changes in v3: - Change to use hwtimestamp - Link to v2: https://lore.kernel.org/r/20250702-iso_ts-v2-1-723d199c8068@amlogic.com Changes in v2: - Support SOCK_RCVTSTAMPNS via CMSG for ISO sockets - Link to v1: https://lore.kernel.org/r/20250429-iso_ts-v1-1-e586f30de6cb@amlogic.com --- net/bluetooth/iso.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c index fc22782cbeeb..67ff355167d8 100644 --- a/net/bluetooth/iso.c +++ b/net/bluetooth/iso.c @@ -2301,13 +2301,21 @@ void iso_recv(struct hci_conn *hcon, struct sk_buff *skb, u16 flags) if (ts) { struct hci_iso_ts_data_hdr *hdr; - /* TODO: add timestamp to the packet? */ hdr = skb_pull_data(skb, HCI_ISO_TS_DATA_HDR_SIZE); if (!hdr) { BT_ERR("Frame is too short (len %d)", skb->len); goto drop; } + /* The ISO ts is based on the controller’s clock domain, + * so hardware timestamping (hwtimestamp) must be used. + * Ref: Documentation/networking/timestamping.rst, + * chapter 3.1 Hardware Timestamping. + */ + struct skb_shared_hwtstamps *hwts = skb_hwtstamps(skb); + if (hwts) + hwts->hwtstamp = us_to_ktime(le32_to_cpu(hdr->ts)); + len = __le16_to_cpu(hdr->slen); } else { struct hci_iso_data_hdr *hdr; --- base-commit: 3bc46213b81278f3a9df0324768e152de71eb9fe change-id: 20250421-iso_ts-c82a300ae784 Best regards, -- Yang Li