Skip to content

Commit 3029916

Browse files
Thalleycarlescufi
authored andcommitted
Bluetooth: MICP: Replace busy bool with atomic
Replace the busy boolean flag with an atomic value. This prevents any race conditions with the MICP client implementation. This also adds a missing check for the discovery procedure. Signed-off-by: Emil Gydesen <[email protected]>
1 parent 60c1c50 commit 3029916

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

subsys/bluetooth/audio/micp_internal.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818
#include <zephyr/autoconf.h>
1919
#include <zephyr/bluetooth/conn.h>
2020
#include <zephyr/bluetooth/gatt.h>
21+
#include <zephyr/sys/atomic.h>
22+
23+
enum bt_micp_mic_ctlr_flag {
24+
BT_MICP_MIC_CTLR_FLAG_BUSY,
25+
26+
BT_MICP_MIC_CTLR_FLAG_NUM_FLAGS, /* keep as last */
27+
};
2128

2229
struct bt_micp_mic_ctlr {
2330
uint16_t start_handle;
@@ -26,7 +33,6 @@ struct bt_micp_mic_ctlr {
2633
struct bt_gatt_subscribe_params mute_sub_params;
2734
struct bt_gatt_discover_params mute_sub_disc_params;
2835

29-
bool busy;
3036
uint8_t mute_val_buf[1]; /* Mute value is a single octet */
3137
struct bt_gatt_write_params write_params;
3238
struct bt_gatt_read_params read_params;
@@ -37,6 +43,8 @@ struct bt_micp_mic_ctlr {
3743
uint8_t aics_inst_cnt;
3844
struct bt_aics *aics[CONFIG_BT_MICP_MIC_CTLR_MAX_AICS_INST];
3945
#endif /* CONFIG_BT_MICP_MIC_CTLR_AICS */
46+
47+
ATOMIC_DEFINE(flags, BT_MICP_MIC_CTLR_FLAG_NUM_FLAGS);
4048
};
4149

4250
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MICP_INTERNAL_ */

subsys/bluetooth/audio/micp_mic_ctlr.c

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ static void micp_mic_ctlr_discover_complete(struct bt_micp_mic_ctlr *mic_ctlr, i
8080
{
8181
struct bt_micp_mic_ctlr_cb *listener, *next;
8282

83+
atomic_clear_bit(mic_ctlr->flags, BT_MICP_MIC_CTLR_FLAG_BUSY);
84+
8385
SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&micp_mic_ctlr_cbs, listener, next, _node) {
8486
if (listener->discover) {
8587
uint8_t aics_cnt = 0U;
@@ -128,7 +130,7 @@ static uint8_t micp_mic_ctlr_read_mute_cb(struct bt_conn *conn, uint8_t err,
128130
uint8_t cb_err = err;
129131
uint8_t mute_val = 0;
130132

131-
mic_ctlr->busy = false;
133+
atomic_clear_bit(mic_ctlr->flags, BT_MICP_MIC_CTLR_FLAG_BUSY);
132134

133135
if (err > 0) {
134136
LOG_DBG("err: 0x%02X", err);
@@ -155,7 +157,7 @@ static void micp_mic_ctlr_write_mics_mute_cb(struct bt_conn *conn, uint8_t err,
155157

156158
LOG_DBG("Write %s (0x%02X)", err ? "failed" : "successful", err);
157159

158-
mic_ctlr->busy = false;
160+
atomic_clear_bit(mic_ctlr->flags, BT_MICP_MIC_CTLR_FLAG_BUSY);
159161

160162
micp_mic_ctlr_mute_written(mic_ctlr, err, mute_val);
161163
}
@@ -540,6 +542,11 @@ int bt_micp_mic_ctlr_discover(struct bt_conn *conn, struct bt_micp_mic_ctlr **mi
540542
}
541543

542544
mic_ctlr = mic_ctlr_get_by_conn(conn);
545+
if (atomic_test_and_set_bit(mic_ctlr->flags, BT_MICP_MIC_CTLR_FLAG_BUSY)) {
546+
LOG_DBG("Instance is busy");
547+
548+
return -EBUSY;
549+
}
543550

544551
(void)memset(&mic_ctlr->discover_params, 0,
545552
sizeof(mic_ctlr->discover_params));
@@ -589,6 +596,8 @@ int bt_micp_mic_ctlr_discover(struct bt_conn *conn, struct bt_micp_mic_ctlr **mi
589596
err = bt_gatt_discover(conn, &mic_ctlr->discover_params);
590597
if (err == 0) {
591598
*mic_ctlr_out = mic_ctlr;
599+
} else {
600+
atomic_clear_bit(mic_ctlr->flags, BT_MICP_MIC_CTLR_FLAG_BUSY);
592601
}
593602

594603
return err;
@@ -682,7 +691,9 @@ int bt_micp_mic_ctlr_mute_get(struct bt_micp_mic_ctlr *mic_ctlr)
682691
if (mic_ctlr->mute_handle == 0) {
683692
LOG_DBG("Handle not set");
684693
return -EINVAL;
685-
} else if (mic_ctlr->busy) {
694+
} else if (atomic_test_and_set_bit(mic_ctlr->flags, BT_MICP_MIC_CTLR_FLAG_BUSY)) {
695+
LOG_DBG("Instance is busy");
696+
686697
return -EBUSY;
687698
}
688699

@@ -692,14 +703,14 @@ int bt_micp_mic_ctlr_mute_get(struct bt_micp_mic_ctlr *mic_ctlr)
692703
mic_ctlr->read_params.single.offset = 0U;
693704

694705
err = bt_gatt_read(mic_ctlr->conn, &mic_ctlr->read_params);
695-
if (err == 0) {
696-
mic_ctlr->busy = true;
706+
if (err != 0) {
707+
atomic_clear_bit(mic_ctlr->flags, BT_MICP_MIC_CTLR_FLAG_BUSY);
697708
}
698709

699710
return err;
700711
}
701712

702-
int bt_micp_mic_ctlr_write_mute(struct bt_micp_mic_ctlr *mic_ctlr, bool mute)
713+
static int bt_micp_mic_ctlr_write_mute(struct bt_micp_mic_ctlr *mic_ctlr, bool mute)
703714
{
704715
int err;
705716

@@ -711,7 +722,9 @@ int bt_micp_mic_ctlr_write_mute(struct bt_micp_mic_ctlr *mic_ctlr, bool mute)
711722
if (mic_ctlr->mute_handle == 0) {
712723
LOG_DBG("Handle not set");
713724
return -EINVAL;
714-
} else if (mic_ctlr->busy) {
725+
} else if (atomic_test_and_set_bit(mic_ctlr->flags, BT_MICP_MIC_CTLR_FLAG_BUSY)) {
726+
LOG_DBG("Instance is busy");
727+
715728
return -EBUSY;
716729
}
717730

@@ -723,8 +736,8 @@ int bt_micp_mic_ctlr_write_mute(struct bt_micp_mic_ctlr *mic_ctlr, bool mute)
723736
mic_ctlr->write_params.func = micp_mic_ctlr_write_mics_mute_cb;
724737

725738
err = bt_gatt_write(mic_ctlr->conn, &mic_ctlr->write_params);
726-
if (err == 0) {
727-
mic_ctlr->busy = true;
739+
if (err != 0) {
740+
atomic_clear_bit(mic_ctlr->flags, BT_MICP_MIC_CTLR_FLAG_BUSY);
728741
}
729742

730743
return err;

0 commit comments

Comments
 (0)