From patchwork Thu Sep 1 10:43:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bastien Nocera X-Patchwork-Id: 603118 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1DAD9ECAAD1 for ; Thu, 1 Sep 2022 10:43:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233893AbiIAKnt (ORCPT ); Thu, 1 Sep 2022 06:43:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58580 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234299AbiIAKnn (ORCPT ); Thu, 1 Sep 2022 06:43:43 -0400 Received: from relay10.mail.gandi.net (relay10.mail.gandi.net [217.70.178.230]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 71A9CDD769 for ; Thu, 1 Sep 2022 03:43:40 -0700 (PDT) Received: (Authenticated sender: hadess@hadess.net) by mail.gandi.net (Postfix) with ESMTPSA id 13CDF240009 for ; Thu, 1 Sep 2022 10:43:37 +0000 (UTC) From: Bastien Nocera To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v6 1/6] adapter: Keep track of whether the adapter is rfkill'ed Date: Thu, 1 Sep 2022 12:43:26 +0200 Message-Id: <20220901104331.174588-1-hadess@hadess.net> X-Mailer: git-send-email 2.37.2 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Instead of only replying to D-Bus requests with an error saying the adapter is blocked, keep track of the rfkill being enabled or disabled so we know the rfkill state of the adapter at all times. --- src/adapter.c | 25 +++++++++++++++++-- src/adapter.h | 1 + src/btd.h | 1 + src/rfkill.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 91 insertions(+), 4 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 51b099dae..7c11a688d 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -250,6 +250,7 @@ struct btd_adapter { uint32_t dev_class; /* controller class of device */ char *name; /* controller device name */ char *short_name; /* controller short name */ + bool blocked; /* whether rfkill is enabled */ uint32_t supported_settings; /* controller supported settings */ uint32_t pending_settings; /* pending controller settings */ uint32_t current_settings; /* current controller settings */ @@ -654,6 +655,8 @@ static void set_mode_complete(uint8_t status, uint16_t length, if (status != MGMT_STATUS_SUCCESS) { btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)", mgmt_errstr(status), status); + if (status == MGMT_STATUS_RFKILLED) + adapter->blocked = true; adapter->pending_settings &= ~data->setting; return; } @@ -2947,10 +2950,12 @@ static void property_set_mode_complete(uint8_t status, uint16_t length, btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)", mgmt_errstr(status), status); - if (status == MGMT_STATUS_RFKILLED) + if (status == MGMT_STATUS_RFKILLED) { dbus_err = ERROR_INTERFACE ".Blocked"; - else + adapter->blocked = true; + } else { dbus_err = ERROR_INTERFACE ".Failed"; + } g_dbus_pending_property_error(data->id, dbus_err, mgmt_errstr(status)); @@ -6681,6 +6686,7 @@ static void load_config(struct btd_adapter *adapter) static struct btd_adapter *btd_adapter_new(uint16_t index) { struct btd_adapter *adapter; + int blocked; adapter = g_try_new0(struct btd_adapter, 1); if (!adapter) @@ -6689,6 +6695,9 @@ static struct btd_adapter *btd_adapter_new(uint16_t index) adapter->dev_id = index; adapter->mgmt = mgmt_ref(mgmt_primary); adapter->pincode_requested = false; + blocked = rfkill_get_blocked(index); + if (blocked > 0) + adapter->blocked = true; /* * Setup default configuration values. These are either adapter @@ -6714,6 +6723,8 @@ static struct btd_adapter *btd_adapter_new(uint16_t index) DBG("Modalias: %s", adapter->modalias); DBG("Discoverable timeout: %u seconds", adapter->discoverable_timeout); DBG("Pairable timeout: %u seconds", adapter->pairable_timeout); + if (blocked > 0) + DBG("Blocked: yes"); adapter->auths = g_queue_new(); adapter->exps = queue_new(); @@ -7581,6 +7592,9 @@ int btd_cancel_authorization(guint id) int btd_adapter_restore_powered(struct btd_adapter *adapter) { + if (adapter->blocked) + adapter->blocked = false; + if (btd_adapter_get_powered(adapter)) return 0; @@ -7589,6 +7603,13 @@ int btd_adapter_restore_powered(struct btd_adapter *adapter) return 0; } +int btd_adapter_set_blocked(struct btd_adapter *adapter) +{ + if (!adapter->blocked) + adapter->blocked = true; + return 0; +} + void btd_adapter_register_pin_cb(struct btd_adapter *adapter, btd_adapter_pin_cb_t cb) { diff --git a/src/adapter.h b/src/adapter.h index f38f473b7..78eb069ae 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -144,6 +144,7 @@ guint btd_request_authorization_cable_configured(const bdaddr_t *src, const bdad int btd_cancel_authorization(guint id); int btd_adapter_restore_powered(struct btd_adapter *adapter); +int btd_adapter_set_blocked(struct btd_adapter *adapter); typedef ssize_t (*btd_adapter_pin_cb_t) (struct btd_adapter *adapter, struct btd_device *dev, char *out, bool *display, diff --git a/src/btd.h b/src/btd.h index c02b2691e..63be6d8d4 100644 --- a/src/btd.h +++ b/src/btd.h @@ -144,6 +144,7 @@ void plugin_cleanup(void); void rfkill_init(void); void rfkill_exit(void); +int rfkill_get_blocked(uint16_t index); GKeyFile *btd_get_main_conf(void); bool btd_kernel_experimental_enabled(const char *uuid); diff --git a/src/rfkill.c b/src/rfkill.c index 2099c5ac5..511e351b8 100644 --- a/src/rfkill.c +++ b/src/rfkill.c @@ -55,12 +55,73 @@ struct rfkill_event { }; #define RFKILL_EVENT_SIZE_V1 8 +int rfkill_get_blocked(uint16_t index) +{ + struct rfkill_event event = { 0 }; + int fd; + ssize_t len; + int blocked = -1; + + fd = open("/dev/rfkill", O_RDWR); + if (fd < 0) { + DBG("Failed to open RFKILL control device"); + return -1; + } + + while (1) { + char sysname[PATH_MAX]; + int namefd, id; + + len = read(fd, &event, sizeof(event)); + if (len < 0) { + if (errno == EAGAIN) + return -1; + return -1; + } + + if (len < RFKILL_EVENT_SIZE_V1) + return -1; + + snprintf(sysname, sizeof(sysname) - 1, + "/sys/class/rfkill/rfkill%u/name", event.idx); + + namefd = open(sysname, O_RDONLY); + if (namefd < 0) + continue; + + memset(sysname, 0, sizeof(sysname)); + + if (read(namefd, sysname, sizeof(sysname) - 1) < 4) { + close(namefd); + continue; + } + + close(namefd); + + if (g_str_has_prefix(sysname, "hci") == FALSE) + continue; + + id = atoi(sysname + 3); + if (id < 0) + continue; + + if (index == id) { + blocked = event.soft || event.hard; + break; + } + } + close(fd); + + return blocked; +} + static gboolean rfkill_event(GIOChannel *chan, GIOCondition cond, gpointer data) { struct rfkill_event event = { 0 }; struct btd_adapter *adapter; char sysname[PATH_MAX]; + bool blocked = false; ssize_t len; int fd, id; @@ -84,7 +145,7 @@ static gboolean rfkill_event(GIOChannel *chan, event.soft, event.hard); if (event.soft || event.hard) - return TRUE; + blocked = true; if (event.op != RFKILL_OP_CHANGE) return TRUE; @@ -122,7 +183,10 @@ static gboolean rfkill_event(GIOChannel *chan, DBG("RFKILL unblock for hci%d", id); - btd_adapter_restore_powered(adapter); + if (blocked) + btd_adapter_set_blocked(adapter); + else + btd_adapter_restore_powered(adapter); return TRUE; } From patchwork Thu Sep 1 10:43:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bastien Nocera X-Patchwork-Id: 601958 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 20DFDC0502C for ; Thu, 1 Sep 2022 10:43:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233869AbiIAKnv (ORCPT ); Thu, 1 Sep 2022 06:43:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58622 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234321AbiIAKno (ORCPT ); Thu, 1 Sep 2022 06:43:44 -0400 Received: from relay10.mail.gandi.net (relay10.mail.gandi.net [217.70.178.230]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 718B1DB077 for ; Thu, 1 Sep 2022 03:43:40 -0700 (PDT) Received: (Authenticated sender: hadess@hadess.net) by mail.gandi.net (Postfix) with ESMTPSA id 676E8240010 for ; Thu, 1 Sep 2022 10:43:38 +0000 (UTC) From: Bastien Nocera To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v6 2/6] adapter: Implement PowerState property Date: Thu, 1 Sep 2022 12:43:27 +0200 Message-Id: <20220901104331.174588-2-hadess@hadess.net> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220901104331.174588-1-hadess@hadess.net> References: <20220901104331.174588-1-hadess@hadess.net> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org This property should allow any program to show whether an adapter is in the process of being turned on. As turning on an adapter isn't instantaneous, it's important that the UI reflects the transitional state of the adapter's power, and doesn't assume the device is already turned on but not yet working, or still off despite having requested for it to be turned on, in both cases making the UI feel unresponsive. This can also not be implemented in front-ends directly as, then, the status of an adapter wouldn't be reflected correctly in the Settings window if it's turned on in the system menu. Implementing it in the front-ends would also preclude from having feedback about the state of the adapter when bluetoothd is the one powering up the adapter after the rfkill was unblocked. See https://gitlab.gnome.org/GNOME/gnome-bluetooth/-/issues/121 and the original https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5773 --- src/adapter.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 124 insertions(+), 11 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 7c11a688d..11fde03b8 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -239,6 +239,14 @@ struct btd_adapter_pin_cb_iter { /* When the iterator reaches the end, it is NULL and attempt is 0 */ }; +enum { + ADAPTER_POWER_STATE_OFF, + ADAPTER_POWER_STATE_ON, + ADAPTER_POWER_STATE_ON_DISABLING, + ADAPTER_POWER_STATE_OFF_ENABLING, + ADAPTER_POWER_STATE_OFF_BLOCKED, +}; + struct btd_adapter { int ref_count; @@ -250,9 +258,9 @@ struct btd_adapter { uint32_t dev_class; /* controller class of device */ char *name; /* controller device name */ char *short_name; /* controller short name */ - bool blocked; /* whether rfkill is enabled */ uint32_t supported_settings; /* controller supported settings */ uint32_t pending_settings; /* pending controller settings */ + uint32_t power_state; /* the power state */ uint32_t current_settings; /* current controller settings */ char *path; /* adapter object path */ @@ -326,6 +334,24 @@ struct btd_adapter { struct queue *exps; }; +static char *adapter_power_state_str(uint32_t power_state) +{ + switch (power_state) { + case ADAPTER_POWER_STATE_OFF: + return "off"; + case ADAPTER_POWER_STATE_ON: + return "on"; + case ADAPTER_POWER_STATE_ON_DISABLING: + return "on-disabling"; + case ADAPTER_POWER_STATE_OFF_ENABLING: + return "off-enabling"; + case ADAPTER_POWER_STATE_OFF_BLOCKED: + return "off-blocked"; + } + DBG("Invalid power state %d", power_state); + return ""; +} + typedef enum { ADAPTER_AUTHORIZE_DISCONNECTED = 0, ADAPTER_AUTHORIZE_CHECK_CONNECTED @@ -619,6 +645,28 @@ static void settings_changed(struct btd_adapter *adapter, uint32_t settings) } } +static void adapter_set_power_state(struct btd_adapter *adapter, uint32_t value) +{ + if (adapter->power_state == value) + return; + + DBG("%s", adapter_power_state_str(value)); + adapter->power_state = value; + g_dbus_emit_property_changed(dbus_conn, adapter->path, + ADAPTER_INTERFACE, "PowerState"); +} + +static void reset_power_state_target(struct btd_adapter *adapter, uint32_t value) +{ + if (value && + adapter->power_state == ADAPTER_POWER_STATE_OFF_ENABLING) { + adapter_set_power_state(adapter, ADAPTER_POWER_STATE_ON); + } else if (!value && + adapter->power_state == ADAPTER_POWER_STATE_ON_DISABLING) { + adapter_set_power_state(adapter, ADAPTER_POWER_STATE_OFF); + } +} + static void new_settings_callback(uint16_t index, uint16_t length, const void *param, void *user_data) { @@ -636,6 +684,12 @@ static void new_settings_callback(uint16_t index, uint16_t length, if (settings == adapter->current_settings) return; + if ((adapter->current_settings ^ settings) & MGMT_SETTING_POWERED) { + reset_power_state_target(adapter, + settings & MGMT_SETTING_POWERED ? + 0x01 : 0x00); + } + DBG("Settings: 0x%08x", settings); settings_changed(adapter, settings); @@ -644,6 +698,7 @@ static void new_settings_callback(uint16_t index, uint16_t length, struct set_mode_data { struct btd_adapter *adapter; uint32_t setting; + uint8_t value; }; static void set_mode_complete(uint8_t status, uint16_t length, @@ -656,8 +711,11 @@ static void set_mode_complete(uint8_t status, uint16_t length, btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)", mgmt_errstr(status), status); if (status == MGMT_STATUS_RFKILLED) - adapter->blocked = true; + adapter_set_power_state(adapter, ADAPTER_POWER_STATE_OFF_BLOCKED); adapter->pending_settings &= ~data->setting; + if (status != MGMT_STATUS_RFKILLED && + data->setting & MGMT_SETTING_POWERED) + reset_power_state_target(adapter, data->value); return; } @@ -695,6 +753,11 @@ static bool set_mode(struct btd_adapter *adapter, uint16_t opcode, switch (opcode) { case MGMT_OP_SET_POWERED: setting = MGMT_SETTING_POWERED; + if (adapter->power_state != ADAPTER_POWER_STATE_OFF_BLOCKED) { + adapter_set_power_state(adapter, mode ? + ADAPTER_POWER_STATE_OFF_ENABLING : + ADAPTER_POWER_STATE_ON_DISABLING); + } break; case MGMT_OP_SET_CONNECTABLE: setting = MGMT_SETTING_CONNECTABLE; @@ -715,6 +778,7 @@ static bool set_mode(struct btd_adapter *adapter, uint16_t opcode, data = g_new0(struct set_mode_data, 1); data->adapter = adapter; data->setting = setting; + data->value = mode; if (mgmt_send(adapter->mgmt, opcode, adapter->dev_id, sizeof(cp), &cp, @@ -722,8 +786,13 @@ static bool set_mode(struct btd_adapter *adapter, uint16_t opcode, adapter->pending_settings |= setting; return true; } - g_free(data); + if (setting == MGMT_SETTING_POWERED) { + /* cancel the earlier setting */ + adapter_set_power_state(adapter, mode ? + ADAPTER_POWER_STATE_OFF : + ADAPTER_POWER_STATE_ON); + } btd_error(adapter->dev_id, "Failed to set mode for index %u", adapter->dev_id); @@ -2934,6 +3003,7 @@ struct property_set_data { struct btd_adapter *adapter; uint32_t setting; GDBusPendingPropertySet id; + uint8_t value; }; static void property_set_mode_complete(uint8_t status, uint16_t length, @@ -2952,7 +3022,7 @@ static void property_set_mode_complete(uint8_t status, uint16_t length, if (status == MGMT_STATUS_RFKILLED) { dbus_err = ERROR_INTERFACE ".Blocked"; - adapter->blocked = true; + adapter_set_power_state(adapter, ADAPTER_POWER_STATE_OFF_BLOCKED); } else { dbus_err = ERROR_INTERFACE ".Failed"; } @@ -2961,6 +3031,9 @@ static void property_set_mode_complete(uint8_t status, uint16_t length, mgmt_errstr(status)); adapter->pending_settings &= ~data->setting; + if (status != MGMT_STATUS_RFKILLED && + data->setting & MGMT_SETTING_POWERED) + reset_power_state_target(adapter, data->value); return; } @@ -3084,6 +3157,15 @@ static void property_set_mode(struct btd_adapter *adapter, uint32_t setting, data->adapter = adapter; data->setting = setting; data->id = id; + data->setting = setting; + data->value = mode; + + if (setting == MGMT_SETTING_POWERED && + adapter->power_state != ADAPTER_POWER_STATE_OFF_BLOCKED) { + adapter_set_power_state(adapter, mode ? + ADAPTER_POWER_STATE_OFF_ENABLING : + ADAPTER_POWER_STATE_ON_DISABLING); + } if (mgmt_send(adapter->mgmt, opcode, adapter->dev_id, len, param, property_set_mode_complete, data, g_free) > 0) { @@ -3092,6 +3174,12 @@ static void property_set_mode(struct btd_adapter *adapter, uint32_t setting, } g_free(data); + if (setting == MGMT_SETTING_POWERED) { + /* cancel the earlier setting */ + adapter_set_power_state(adapter, mode ? + ADAPTER_POWER_STATE_OFF : + ADAPTER_POWER_STATE_ON); + } failed: btd_error(adapter->dev_id, "Failed to set mode for index %u", @@ -3123,6 +3211,18 @@ static void property_set_powered(const GDBusPropertyTable *property, property_set_mode(adapter, MGMT_SETTING_POWERED, iter, id); } +static gboolean property_get_power_state(const GDBusPropertyTable *property, + DBusMessageIter *iter, void *user_data) +{ + struct btd_adapter *adapter = user_data; + const char *str; + + str = adapter_power_state_str(adapter->power_state); + dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str); + + return TRUE; +} + static gboolean property_get_discoverable(const GDBusPropertyTable *property, DBusMessageIter *iter, void *user_data) { @@ -3761,6 +3861,8 @@ static const GDBusPropertyTable adapter_properties[] = { { "Alias", "s", property_get_alias, property_set_alias }, { "Class", "u", property_get_class }, { "Powered", "b", property_get_powered, property_set_powered }, + { "PowerState", "s", property_get_power_state, NULL, NULL, + G_DBUS_PROPERTY_FLAG_EXPERIMENTAL }, { "Discoverable", "b", property_get_discoverable, property_set_discoverable }, { "DiscoverableTimeout", "u", property_get_discoverable_timeout, @@ -5567,6 +5669,7 @@ static void adapter_start(struct btd_adapter *adapter) { g_dbus_emit_property_changed(dbus_conn, adapter->path, ADAPTER_INTERFACE, "Powered"); + adapter_set_power_state(adapter, ADAPTER_POWER_STATE_ON); DBG("adapter %s has been enabled", adapter->path); @@ -6697,7 +6800,7 @@ static struct btd_adapter *btd_adapter_new(uint16_t index) adapter->pincode_requested = false; blocked = rfkill_get_blocked(index); if (blocked > 0) - adapter->blocked = true; + adapter->power_state = ADAPTER_POWER_STATE_OFF_BLOCKED; /* * Setup default configuration values. These are either adapter @@ -6724,7 +6827,7 @@ static struct btd_adapter *btd_adapter_new(uint16_t index) DBG("Discoverable timeout: %u seconds", adapter->discoverable_timeout); DBG("Pairable timeout: %u seconds", adapter->pairable_timeout); if (blocked > 0) - DBG("Blocked: yes"); + DBG("Power state: %s", adapter_power_state_str(adapter->power_state)); adapter->auths = g_queue_new(); adapter->exps = queue_new(); @@ -7316,6 +7419,9 @@ static void adapter_stop(struct btd_adapter *adapter) g_dbus_emit_property_changed(dbus_conn, adapter->path, ADAPTER_INTERFACE, "Powered"); + g_dbus_emit_property_changed(dbus_conn, adapter->path, + ADAPTER_INTERFACE, + "PowerState"); DBG("adapter %s has been disabled", adapter->path); } @@ -7592,10 +7698,18 @@ int btd_cancel_authorization(guint id) int btd_adapter_restore_powered(struct btd_adapter *adapter) { - if (adapter->blocked) - adapter->blocked = false; + bool powered; - if (btd_adapter_get_powered(adapter)) + powered = btd_adapter_get_powered(adapter); + if (adapter->power_state == ADAPTER_POWER_STATE_OFF_BLOCKED && + rfkill_get_blocked(adapter->dev_id) == 0) { + adapter_set_power_state(adapter, + powered ? + ADAPTER_POWER_STATE_ON : + ADAPTER_POWER_STATE_OFF); + } + + if (powered) return 0; set_mode(adapter, MGMT_OP_SET_POWERED, 0x01); @@ -7605,8 +7719,7 @@ int btd_adapter_restore_powered(struct btd_adapter *adapter) int btd_adapter_set_blocked(struct btd_adapter *adapter) { - if (!adapter->blocked) - adapter->blocked = true; + adapter_set_power_state(adapter, ADAPTER_POWER_STATE_OFF_BLOCKED); return 0; } From patchwork Thu Sep 1 10:43:28 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bastien Nocera X-Patchwork-Id: 603116 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5F5CDC64991 for ; Thu, 1 Sep 2022 10:43:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234065AbiIAKnx (ORCPT ); Thu, 1 Sep 2022 06:43:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58656 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234355AbiIAKnp (ORCPT ); Thu, 1 Sep 2022 06:43:45 -0400 Received: from relay10.mail.gandi.net (relay10.mail.gandi.net [IPv6:2001:4b98:dc4:8::230]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7CC2212BF7C for ; Thu, 1 Sep 2022 03:43:40 -0700 (PDT) Received: (Authenticated sender: hadess@hadess.net) by mail.gandi.net (Postfix) with ESMTPSA id DA567240013 for ; Thu, 1 Sep 2022 10:43:38 +0000 (UTC) From: Bastien Nocera To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v6 3/6] client: Print the PowerState property Date: Thu, 1 Sep 2022 12:43:28 +0200 Message-Id: <20220901104331.174588-3-hadess@hadess.net> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220901104331.174588-1-hadess@hadess.net> References: <20220901104331.174588-1-hadess@hadess.net> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org --- client/main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/main.c b/client/main.c index 6773d5262..2816e880f 100644 --- a/client/main.c +++ b/client/main.c @@ -981,6 +981,7 @@ static void cmd_show(int argc, char *argv[]) print_property(adapter->proxy, "Alias"); print_property(adapter->proxy, "Class"); print_property(adapter->proxy, "Powered"); + print_property(adapter->proxy, "PowerState"); print_property(adapter->proxy, "Discoverable"); print_property(adapter->proxy, "DiscoverableTimeout"); print_property(adapter->proxy, "Pairable"); From patchwork Thu Sep 1 10:43:29 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bastien Nocera X-Patchwork-Id: 601957 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CD5A1ECAAD3 for ; Thu, 1 Sep 2022 10:43:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232107AbiIAKnw (ORCPT ); Thu, 1 Sep 2022 06:43:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58646 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234344AbiIAKno (ORCPT ); Thu, 1 Sep 2022 06:43:44 -0400 Received: from relay10.mail.gandi.net (relay10.mail.gandi.net [IPv6:2001:4b98:dc4:8::230]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7D1DD12C3CA for ; Thu, 1 Sep 2022 03:43:41 -0700 (PDT) Received: (Authenticated sender: hadess@hadess.net) by mail.gandi.net (Postfix) with ESMTPSA id 45A34240008 for ; Thu, 1 Sep 2022 10:43:39 +0000 (UTC) From: Bastien Nocera To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v6 4/6] adapter-api: Add PowerState property documentation Date: Thu, 1 Sep 2022 12:43:29 +0200 Message-Id: <20220901104331.174588-4-hadess@hadess.net> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220901104331.174588-1-hadess@hadess.net> References: <20220901104331.174588-1-hadess@hadess.net> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org --- doc/adapter-api.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/doc/adapter-api.txt b/doc/adapter-api.txt index 48466ab75..9b2721c1b 100644 --- a/doc/adapter-api.txt +++ b/doc/adapter-api.txt @@ -269,6 +269,21 @@ Properties string Address [readonly] restart or unplugging of the adapter it will reset back to false. + string PowerState [readonly, experimental] + + The power state of an adapter. + + The power state will show whether the adapter is + turning off, or turning on, as well as being on + or off. + + Possible values: + "on" - powered on + "off" - powered off + "off-enabling" - transitioning from "off" to "on" + "on-disabling" - transitioning from "on" to "off" + "off-blocked" - blocked by rfkill + boolean Discoverable [readwrite] Switch an adapter to discoverable or non-discoverable From patchwork Thu Sep 1 10:43:30 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bastien Nocera X-Patchwork-Id: 603117 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3E0F6C54EE9 for ; Thu, 1 Sep 2022 10:43:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233925AbiIAKnw (ORCPT ); Thu, 1 Sep 2022 06:43:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58642 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234339AbiIAKno (ORCPT ); Thu, 1 Sep 2022 06:43:44 -0400 Received: from relay10.mail.gandi.net (relay10.mail.gandi.net [IPv6:2001:4b98:dc4:8::230]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7D25F12CB20 for ; Thu, 1 Sep 2022 03:43:41 -0700 (PDT) Received: (Authenticated sender: hadess@hadess.net) by mail.gandi.net (Postfix) with ESMTPSA id 9CB14240016 for ; Thu, 1 Sep 2022 10:43:39 +0000 (UTC) From: Bastien Nocera To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v6 5/6] adapter: Fix typo in function name Date: Thu, 1 Sep 2022 12:43:30 +0200 Message-Id: <20220901104331.174588-5-hadess@hadess.net> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220901104331.174588-1-hadess@hadess.net> References: <20220901104331.174588-1-hadess@hadess.net> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org --- src/adapter.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index 11fde03b8..dc96b9718 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -3508,7 +3508,7 @@ static gboolean property_get_experimental(const GDBusPropertyTable *property, return TRUE; } -static gboolean property_experimental_exits(const GDBusPropertyTable *property, +static gboolean property_experimental_exists(const GDBusPropertyTable *property, void *data) { struct btd_adapter *adapter = data; @@ -3876,7 +3876,7 @@ static const GDBusPropertyTable adapter_properties[] = { property_exists_modalias }, { "Roles", "as", property_get_roles }, { "ExperimentalFeatures", "as", property_get_experimental, NULL, - property_experimental_exits }, + property_experimental_exists }, { } }; From patchwork Thu Sep 1 10:43:31 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bastien Nocera X-Patchwork-Id: 601956 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4E0C9ECAAD1 for ; Thu, 1 Sep 2022 10:43:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233890AbiIAKny (ORCPT ); Thu, 1 Sep 2022 06:43:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58644 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234368AbiIAKnq (ORCPT ); Thu, 1 Sep 2022 06:43:46 -0400 Received: from relay10.mail.gandi.net (relay10.mail.gandi.net [217.70.178.230]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D5DD9BB93B for ; Thu, 1 Sep 2022 03:43:41 -0700 (PDT) Received: (Authenticated sender: hadess@hadess.net) by mail.gandi.net (Postfix) with ESMTPSA id EAB02240017 for ; Thu, 1 Sep 2022 10:43:39 +0000 (UTC) From: Bastien Nocera To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ v6 6/6] adapter: Remove experimental flag for PowerState Date: Thu, 1 Sep 2022 12:43:31 +0200 Message-Id: <20220901104331.174588-6-hadess@hadess.net> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220901104331.174588-1-hadess@hadess.net> References: <20220901104331.174588-1-hadess@hadess.net> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Now that the feature has been tested, that the API is deemed adequate and the reliability sufficient. --- src/adapter.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index dc96b9718..b3d25f4b0 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -3861,8 +3861,7 @@ static const GDBusPropertyTable adapter_properties[] = { { "Alias", "s", property_get_alias, property_set_alias }, { "Class", "u", property_get_class }, { "Powered", "b", property_get_powered, property_set_powered }, - { "PowerState", "s", property_get_power_state, NULL, NULL, - G_DBUS_PROPERTY_FLAG_EXPERIMENTAL }, + { "PowerState", "s", property_get_power_state }, { "Discoverable", "b", property_get_discoverable, property_set_discoverable }, { "DiscoverableTimeout", "u", property_get_discoverable_timeout,