diff --git a/subsys/bluetooth/controller/ll_sw/ull_iso.c b/subsys/bluetooth/controller/ll_sw/ull_iso.c index 126e3b9b58f..33d7524279e 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_iso.c +++ b/subsys/bluetooth/controller/ll_sw/ull_iso.c @@ -909,16 +909,45 @@ uint8_t ll_read_iso_link_quality(uint16_t handle, uint32_t *rx_unreceived_packets, uint32_t *duplicate_packets) { - ARG_UNUSED(handle); - ARG_UNUSED(tx_unacked_packets); - ARG_UNUSED(tx_flushed_packets); - ARG_UNUSED(tx_last_subevent_packets); - ARG_UNUSED(retransmitted_packets); - ARG_UNUSED(crc_error_packets); - ARG_UNUSED(rx_unreceived_packets); - ARG_UNUSED(duplicate_packets); + uint8_t status; - return BT_HCI_ERR_CMD_DISALLOWED; + *tx_unacked_packets = 0; + *tx_flushed_packets = 0; + *tx_last_subevent_packets = 0; + *retransmitted_packets = 0; + *crc_error_packets = 0; + *rx_unreceived_packets = 0; + *duplicate_packets = 0; + + status = BT_HCI_ERR_SUCCESS; + + if (IS_CIS_HANDLE(handle)) { + struct ll_conn_iso_stream *cis; + + cis = ll_iso_stream_connected_get(handle); + + if (!cis) { + /* CIS is not connected */ + return BT_HCI_ERR_UNKNOWN_CONN_ID; + } + + *tx_unacked_packets = cis->hdr.link_quality.tx_unacked_packets; + *tx_flushed_packets = cis->hdr.link_quality.tx_flushed_packets; + *tx_last_subevent_packets = cis->hdr.link_quality.tx_last_subevent_packets; + *retransmitted_packets = cis->hdr.link_quality.retransmitted_packets; + *crc_error_packets = cis->hdr.link_quality.crc_error_packets; + *rx_unreceived_packets = cis->hdr.link_quality.rx_unreceived_packets; + *duplicate_packets = cis->hdr.link_quality.duplicate_packets; + + } else if (IS_SYNC_ISO_HANDLE(handle)) { + /* FIXME: Implement for sync receiver */ + status = BT_HCI_ERR_CMD_DISALLOWED; + } else { + /* Handle is out of range */ + status = BT_HCI_ERR_UNKNOWN_CONN_ID; + } + + return status; } #endif /* CONFIG_BT_CTLR_READ_ISO_LINK_QUALITY */ diff --git a/subsys/bluetooth/controller/ll_sw/ull_iso_types.h b/subsys/bluetooth/controller/ll_sw/ull_iso_types.h index 42a5bd623bc..18d9a0f7bfe 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_iso_types.h +++ b/subsys/bluetooth/controller/ll_sw/ull_iso_types.h @@ -55,13 +55,27 @@ struct ll_iso_test_mode_data { uint64_t rx_payload_type:4; }; +struct ll_iso_link_quality { + uint32_t tx_unacked_packets; + uint32_t tx_flushed_packets; + uint32_t tx_last_subevent_packets; + uint32_t retransmitted_packets; + uint32_t crc_error_packets; + uint32_t rx_unreceived_packets; + uint32_t duplicate_packets; +}; + /* Common members for ll_conn_iso_stream and ll_broadcast_iso_stream */ struct ll_iso_stream_hdr { struct ll_iso_test_mode_data test_mode; struct ll_iso_datapath *datapath_in; struct ll_iso_datapath *datapath_out; +#if defined(CONFIG_BT_CTLR_READ_ISO_LINK_QUALITY) + struct ll_iso_link_quality link_quality; +#endif /* CONFIG_BT_CTLR_READ_ISO_LINK_QUALITY */ }; + struct ll_iso_datapath { uint8_t path_dir; uint8_t path_id;