From patchwork Fri Mar 20 01:50:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Pandit-Subedi X-Patchwork-Id: 11448273 X-Patchwork-Delegate: luiz.dentz@gmail.com Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 76A3F1893 for ; Fri, 20 Mar 2020 01:50:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 56E2A2076C for ; Fri, 20 Mar 2020 01:50:29 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="i2YOhPJE" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727401AbgCTBu3 (ORCPT ); Thu, 19 Mar 2020 21:50:29 -0400 Received: from mail-pj1-f52.google.com ([209.85.216.52]:55691 "EHLO mail-pj1-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727192AbgCTBu2 (ORCPT ); Thu, 19 Mar 2020 21:50:28 -0400 Received: by mail-pj1-f52.google.com with SMTP id mj6so1796150pjb.5 for ; Thu, 19 Mar 2020 18:50:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=beFEUX3MbwzmugTexHZnvU+XdMz+mzb4XXeBdaJB39E=; b=i2YOhPJE9siKggAcr8H/1YLv79EjoGFtKimBVMVU5pcwCRY0FfFer/syc8FaPfFeKt k6HEydiXK546y8MVTlc5MUT+Ftgwgao6jdrzCSS2ySALPceUi297P71sMJn7z1XgCXus EP/34Kg3hJEJFlQZh2fA/dM3Z59Ottf6JS2bk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=beFEUX3MbwzmugTexHZnvU+XdMz+mzb4XXeBdaJB39E=; b=kzF9oGuZMsGBH6WZBqxByboCU2/Db9BwSeGvNX396EeGN3xl97LVK11QMj1iahOIDW a37XtDB5MKkD5Xp081EP9wd7aEStIM2rEfhg48EMqciKfP5321TBTpVI5vMzMkI2XUYO 2ABjAq+5X4BvjfDLkJAFJBG3m3Rkh7cidVjU5j7vi1OVhfKMcT4WcEMYLZ1GGgoyH0Dy ITJuSXYh0manxdZkUMHYx4f4FkO5eTbT9ZV9TV5/tCv3JjIIfxYY4UPHXGO1zl/3zC9f hspeA3NlQI6uvNFpgSWoXiNR/BvL+jrXewpdhFnNzYdCeEoDT40pyWpOeGATJkOkoC/5 fJXw== X-Gm-Message-State: ANhLgQ3O15uAVWK0VDhnNCoxsF8mCWS3mHcY8C8zDvULXiY8E11cE5ui Te/FcblD+888KjFqdvV80MjYjQ== X-Google-Smtp-Source: ADFU+vuptLAbbOOy412Rjt5M7K9ka9p68WOlJUv/lr8XjSlX8+06myWP206zd+jhFGSzAPfDhgmLAA== X-Received: by 2002:a17:902:7c8e:: with SMTP id y14mr5881754pll.139.1584669027543; Thu, 19 Mar 2020 18:50:27 -0700 (PDT) Received: from apsdesk.mtv.corp.google.com ([2620:15c:202:1:e09a:8d06:a338:aafb]) by smtp.gmail.com with ESMTPSA id 136sm3410485pgh.26.2020.03.19.18.50.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2020 18:50:27 -0700 (PDT) From: Abhishek Pandit-Subedi To: luiz.dentz@gmail.com, marcel@holtmann.org Cc: alainm@chromium.org, chromeos-bluetooth-upstreaming@chromium.org, linux-bluetooth@vger.kernel.org, Abhishek Pandit-Subedi Subject: [BlueZ PATCH v4 1/5] mgmt: Update docs for Add Device Date: Thu, 19 Mar 2020 18:50:19 -0700 Message-Id: <20200319185000.BlueZ.v4.1.Idb4f0444e40064a861ee73b098264abd30114aaa@changeid> X-Mailer: git-send-email 2.25.1.696.g5e7596f4ac-goog In-Reply-To: <20200320015023.85896-1-abhishekpandit@chromium.org> References: <20200320015023.85896-1-abhishekpandit@chromium.org> MIME-Version: 1.0 Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Update the docs for Add Device with information on flags mask and value. Add information on the Wakeable flag that can be set to allow the device to wake the system from suspend. --- Changes in v4: * Newly added support in Add Device for flags Changes in v3: None Changes in v2: None doc/mgmt-api.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt index 27a41f334..e99c23710 100644 --- a/doc/mgmt-api.txt +++ b/doc/mgmt-api.txt @@ -1997,6 +1997,8 @@ Add Device Command Command Parameters: Address (6 Octets) Address_Type (1 Octet) Action (1 Octet) + Flags Mask (1 Octet) + Flags Value (1 Octet) Return Parameters: Address (6 Octets) Address_Type (1 Octet) @@ -2014,6 +2016,9 @@ Add Device Command 1 Allow incoming connection 2 Auto-connect remote device + The following flags are supported: + 0x1 Wakeable + With the Action 0, when the device is found, a new Device Found event will be sent indicating this device is available. This action is only valid for LE Public and LE Random address types. @@ -2036,6 +2041,13 @@ Add Device Command connectable setting is off. This acts as list of known trusted devices. + To set flags on the device, first set the bit in the mask for the + flag to set and then set or clear the bit in the value to indicate + whether the flag should be set. + + The Wakeable flag controls whether this device can wake the system + from suspend. + This command can be used when the controller is not powered and all settings will be programmed once powered. From patchwork Fri Mar 20 01:50:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Pandit-Subedi X-Patchwork-Id: 11448279 X-Patchwork-Delegate: luiz.dentz@gmail.com Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 870B71874 for ; Fri, 20 Mar 2020 01:50:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 534322076C for ; Fri, 20 Mar 2020 01:50:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="H7UR+Ml9" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727415AbgCTBuc (ORCPT ); Thu, 19 Mar 2020 21:50:32 -0400 Received: from mail-pj1-f68.google.com ([209.85.216.68]:56318 "EHLO mail-pj1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727402AbgCTBuc (ORCPT ); Thu, 19 Mar 2020 21:50:32 -0400 Received: by mail-pj1-f68.google.com with SMTP id mj6so1796166pjb.5 for ; Thu, 19 Mar 2020 18:50:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7RGjQaTpEB5nUX+Z0UYTis66iY6giHxWP2qiqnvDq4M=; b=H7UR+Ml9lX6jUVzQI1ukAOu7th/nW6FP8V6BSXEbyErQzjztv+MdF/YOVPW35RgHjx NNti9nn/qVu4uL29wwkZ3GqaOnFKr3TV4a9PtV79cy5BbC5N1X4T4fkQ5UJVDXGVf5HC 0BetHLFy0IQgIsH89Gquc0bfFkLWWzZzzk2B0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7RGjQaTpEB5nUX+Z0UYTis66iY6giHxWP2qiqnvDq4M=; b=at0M3qOUycQMw6KxAO2F4wHejGy46v7nYi8PAEr3ZmBJDqKPF93LsOCAfqjA1cB0WR dACChKxc8VOC9qFd8rDdEAfHVY7MnTPzA1xPUzanL5l+eHIXITKi8PNOq1wlh2rLDW9m FTaFCMNX5HA+skPFgHdOh7nWs9ZHwkQ+FpfzWujM+YJtzdBvjUkddcd3K2cfen8+vatH 5KiIimI8AX8CGAy1UuwzYFFk/IdQzWuC4PjUdDxHDIZO9hjk6tmjtbw3aT4DGz0I4xr0 Gs9QMeWPGOL02lKoFd1TGhTRIQ2eUz15Cqh3xSDOhieilNOt/VjP68XCd0Qj/TSqH085 V8CQ== X-Gm-Message-State: ANhLgQ0/wAx1hanHtbTgnMdao3M4hSfoaZmh83CS4L0oBr+RMMw3aSOM qvoWrScGp1dGD9V2STDyG0fGzQ== X-Google-Smtp-Source: ADFU+vusvdDctFG94n22wuYYBGO/yFXFrFuopHSIAoICMhMX8JlveWWXdvBlxODkC7BqvjWXeDl1Gw== X-Received: by 2002:a17:902:c203:: with SMTP id 3mr6479566pll.254.1584669028749; Thu, 19 Mar 2020 18:50:28 -0700 (PDT) Received: from apsdesk.mtv.corp.google.com ([2620:15c:202:1:e09a:8d06:a338:aafb]) by smtp.gmail.com with ESMTPSA id 136sm3410485pgh.26.2020.03.19.18.50.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2020 18:50:28 -0700 (PDT) From: Abhishek Pandit-Subedi To: luiz.dentz@gmail.com, marcel@holtmann.org Cc: alainm@chromium.org, chromeos-bluetooth-upstreaming@chromium.org, linux-bluetooth@vger.kernel.org, Abhishek Pandit-Subedi Subject: [BlueZ PATCH v4 2/5] device: Support marking a device with wake allowed Date: Thu, 19 Mar 2020 18:50:20 -0700 Message-Id: <20200319185000.BlueZ.v4.2.I2cd5c420daf55ee6084b53e025461824521d744a@changeid> X-Mailer: git-send-email 2.25.1.696.g5e7596f4ac-goog In-Reply-To: <20200320015023.85896-1-abhishekpandit@chromium.org> References: <20200320015023.85896-1-abhishekpandit@chromium.org> MIME-Version: 1.0 Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org If a device is allowed to wake the host system from suspend, it should be marked as wake allowed. We add support for a new property that is sent to the kernel via flags in the add_device mgmt op. We also add the dbus endpoint to allow the wake allowed setting to be controlled. In order for wake allowed to be set, the profile must also support wake. This setting isn't exposed to the user but must be set by profiles that intend to support wake from suspend. --- Changes in v4: * Renamed wake_capable to wake_allowed * Removed set_wake_capable mgmt op and updated add_device to accept flags to set whether a device is wakeable * Refactored adapter_whitelist_add and adapter_auto_connect_add to call adapter_add_device Changes in v3: * Added profile_wake_support and made wake_capable dependent on it Changes in v2: * Added dbus api "WakeCapable" to set value * Update device_set_wake_capable to be called by adapter_set_wake_capable_complete so we can emit property changed lib/mgmt.h | 3 ++ src/adapter.c | 112 ++++++++++++++++---------------------------- src/adapter.h | 1 + src/device.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/device.h | 8 ++++ 5 files changed, 177 insertions(+), 72 deletions(-) diff --git a/lib/mgmt.h b/lib/mgmt.h index 7682537fe..732d3afa8 100644 --- a/lib/mgmt.h +++ b/lib/mgmt.h @@ -395,10 +395,13 @@ struct mgmt_rp_get_clock_info { struct mgmt_cp_add_device { struct mgmt_addr_info addr; uint8_t action; + uint8_t flags_mask; + uint8_t flags_value; } __packed; struct mgmt_rp_add_device { struct mgmt_addr_info addr; } __packed; +#define DEVICE_FLAG_WAKEABLE 0x1 #define MGMT_OP_REMOVE_DEVICE 0x0034 struct mgmt_cp_remove_device { diff --git a/src/adapter.c b/src/adapter.c index 972d88772..6bfd31fb0 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -4654,7 +4654,7 @@ void adapter_connect_list_remove(struct btd_adapter *adapter, trigger_passive_scanning(adapter); } -static void add_whitelist_complete(uint8_t status, uint16_t length, +static void add_device_complete(uint8_t status, uint16_t length, const void *param, void *user_data) { const struct mgmt_rp_add_device *rp = param; @@ -4670,8 +4670,8 @@ static void add_whitelist_complete(uint8_t status, uint16_t length, ba2str(&rp->addr.bdaddr, addr); - dev = btd_adapter_find_device(adapter, &rp->addr.bdaddr, - rp->addr.type); + dev = btd_adapter_find_device(adapter, &rp->addr.bdaddr, rp->addr.type); + if (!dev) { btd_error(adapter->dev_id, "Add Device complete for unknown device %s", addr); @@ -4680,29 +4680,50 @@ static void add_whitelist_complete(uint8_t status, uint16_t length, if (status != MGMT_STATUS_SUCCESS) { btd_error(adapter->dev_id, - "Failed to add device %s: %s (0x%02x)", - addr, mgmt_errstr(status), status); + "Failed to add device %s (%u): %s (0x%02x)", + addr, rp->addr.type, mgmt_errstr(status), status); + + if (rp->addr.type != BDADDR_BREDR) + adapter->connect_list = + g_slist_remove(adapter->connect_list, dev); return; } - DBG("%s added to kernel whitelist", addr); + /* Update flag results if any */ + device_add_complete(dev); + + DBG("%s (%u) added to kernel connect list", addr, rp->addr.type); } -void adapter_whitelist_add(struct btd_adapter *adapter, struct btd_device *dev) +int adapter_add_device(struct btd_adapter *adapter, struct btd_device *device) { struct mgmt_cp_add_device cp; + const bdaddr_t *bdaddr; + uint8_t bdaddr_type; if (!kernel_conn_control) - return; + return 0; + + bdaddr = device_get_address(device); + bdaddr_type = btd_device_get_bdaddr_type(device); memset(&cp, 0, sizeof(cp)); - bacpy(&cp.addr.bdaddr, device_get_address(dev)); - cp.addr.type = BDADDR_BREDR; - cp.action = 0x01; + bacpy(&cp.addr.bdaddr, bdaddr); + cp.addr.type = bdaddr_type; - mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE, - adapter->dev_id, sizeof(cp), &cp, - add_whitelist_complete, adapter, NULL); + /* BREDR will always have action = 0x1 (allow incoming connection) */ + cp.action = bdaddr_type == BDADDR_BREDR ? 0x1 : 0x2; + cp.flags_mask = device_get_flags_mask(device); + cp.flags_value = device_get_flags_value(device); + + return mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE, + adapter->dev_id, sizeof(cp), &cp, add_device_complete, + adapter, NULL); +} + +void adapter_whitelist_add(struct btd_adapter *adapter, struct btd_device *dev) +{ + adapter_add_device(adapter, dev); } static void remove_whitelist_complete(uint8_t status, uint16_t length, @@ -4743,76 +4764,23 @@ void adapter_whitelist_remove(struct btd_adapter *adapter, struct btd_device *de remove_whitelist_complete, adapter, NULL); } -static void add_device_complete(uint8_t status, uint16_t length, - const void *param, void *user_data) -{ - const struct mgmt_rp_add_device *rp = param; - struct btd_adapter *adapter = user_data; - struct btd_device *dev; - char addr[18]; - - if (length < sizeof(*rp)) { - btd_error(adapter->dev_id, - "Too small Add Device complete event"); - return; - } - - ba2str(&rp->addr.bdaddr, addr); - - dev = btd_adapter_find_device(adapter, &rp->addr.bdaddr, - rp->addr.type); - if (!dev) { - btd_error(adapter->dev_id, - "Add Device complete for unknown device %s", addr); - return; - } - - if (status != MGMT_STATUS_SUCCESS) { - btd_error(adapter->dev_id, - "Failed to add device %s (%u): %s (0x%02x)", - addr, rp->addr.type, mgmt_errstr(status), status); - adapter->connect_list = g_slist_remove(adapter->connect_list, - dev); - return; - } - - DBG("%s (%u) added to kernel connect list", addr, rp->addr.type); -} - void adapter_auto_connect_add(struct btd_adapter *adapter, - struct btd_device *device) + struct btd_device *device) { - struct mgmt_cp_add_device cp; - const bdaddr_t *bdaddr; - uint8_t bdaddr_type; - unsigned int id; - - if (!kernel_conn_control) - return; + uint8_t bdaddr_type = btd_device_get_bdaddr_type(device); if (g_slist_find(adapter->connect_list, device)) { DBG("ignoring already added device %s", - device_get_path(device)); + device_get_path(device)); return; } - bdaddr = device_get_address(device); - bdaddr_type = btd_device_get_bdaddr_type(device); - if (bdaddr_type == BDADDR_BREDR) { - DBG("auto-connection feature is not avaiable for BR/EDR"); + DBG("auto-connection feature is not available for BR/EDR"); return; } - memset(&cp, 0, sizeof(cp)); - bacpy(&cp.addr.bdaddr, bdaddr); - cp.addr.type = bdaddr_type; - cp.action = 0x02; - - id = mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE, - adapter->dev_id, sizeof(cp), &cp, add_device_complete, - adapter, NULL); - if (id == 0) + if (adapter_add_device(adapter, device) == 0) return; adapter->connect_list = g_slist_append(adapter->connect_list, device); diff --git a/src/adapter.h b/src/adapter.h index d0a5253bd..a5a9e917a 100644 --- a/src/adapter.h +++ b/src/adapter.h @@ -213,6 +213,7 @@ int adapter_connect_list_add(struct btd_adapter *adapter, struct btd_device *device); void adapter_connect_list_remove(struct btd_adapter *adapter, struct btd_device *device); +int adapter_add_device(struct btd_adapter* adapter, struct btd_device* dev); void adapter_auto_connect_add(struct btd_adapter *adapter, struct btd_device *device); void adapter_auto_connect_remove(struct btd_adapter *adapter, diff --git a/src/device.c b/src/device.c index 69f98e488..c646a7fee 100644 --- a/src/device.c +++ b/src/device.c @@ -184,11 +184,15 @@ struct btd_device { uint8_t conn_bdaddr_type; bdaddr_t bdaddr; uint8_t bdaddr_type; + uint8_t mgmt_flags_mask; /* Flags to update on add_device */ + uint8_t mgmt_flags_value; /* Flag values for add_device */ char *path; bool bredr; bool le; bool pending_paired; /* "Paired" waiting for SDP */ bool svc_refreshed; + bool wake_support; /* Profile supports wake */ + bool wake_allowed; /* Can wake from suspend */ GSList *svc_callbacks; GSList *eir_uuids; struct bt_ad *ad; @@ -415,6 +419,9 @@ static gboolean store_device_info_cb(gpointer user_data) g_key_file_set_boolean(key_file, "General", "Blocked", device->blocked); + g_key_file_set_boolean(key_file, "General", "WakeAllowed", + device->wake_allowed); + if (device->uuids) { GSList *l; int i; @@ -1318,6 +1325,79 @@ dev_property_advertising_data_exist(const GDBusPropertyTable *property, return bt_ad_has_data(device->ad, NULL); } +bool device_get_wake_support(struct btd_device *device) +{ + return device->wake_support; +} + +void device_set_wake_support(struct btd_device *device, bool wake_support) +{ + device->wake_support = wake_support; +} + +bool device_get_wake_allowed(struct btd_device *device) +{ + return device->wake_allowed; +} + +void device_set_wake_allowed(struct btd_device *device, bool wake_allowed) +{ + device->mgmt_flags_mask |= DEVICE_FLAG_WAKEABLE; + if (wake_allowed) + device->mgmt_flags_value |= DEVICE_FLAG_WAKEABLE; + else + device->mgmt_flags_value &= ~DEVICE_FLAG_WAKEABLE; + + adapter_add_device(device->adapter, device); +} + +static gboolean +dev_property_get_wake_allowed(const GDBusPropertyTable *property, + DBusMessageIter *iter, void *data) +{ + struct btd_device *device = data; + dbus_bool_t wake_allowed = + device_get_wake_allowed(device) ? TRUE : FALSE; + + dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &wake_allowed); + + return TRUE; +} + +static void dev_property_set_wake_allowed(const GDBusPropertyTable *property, + DBusMessageIter *value, + GDBusPendingPropertySet id, void *data) +{ + struct btd_device *device = data; + dbus_bool_t b; + + if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN) { + g_dbus_pending_property_error(id, + ERROR_INTERFACE ".InvalidArguments", + "Invalid arguments in method call"); + return; + } + + if (device->temporary) { + g_dbus_pending_property_error(id, + ERROR_INTERFACE ".Unsupported", + "Cannot set property while temporary"); + return; + } + + dbus_message_iter_get_basic(value, &b); + device_set_wake_allowed(device, b); + g_dbus_pending_property_success(id); +} + +static gboolean dev_property_wake_allowed_exist( + const GDBusPropertyTable *property, void *data) +{ + struct btd_device *device = data; + + return device_get_wake_support(device) ? TRUE : FALSE; +} + static gboolean disconnect_all(gpointer user_data) { struct btd_device *device = user_data; @@ -2779,6 +2859,9 @@ static const GDBusPropertyTable device_properties[] = { { "AdvertisingData", "a{yv}", dev_property_get_advertising_data, NULL, dev_property_advertising_data_exist, G_DBUS_PROPERTY_FLAG_EXPERIMENTAL }, + { "WakeAllowed", "b", dev_property_get_wake_allowed, + dev_property_set_wake_allowed, + dev_property_wake_allowed_exist }, { } }; @@ -3030,6 +3113,7 @@ static void load_info(struct btd_device *device, const char *local, char *str; gboolean store_needed = FALSE; gboolean blocked; + gboolean wake_allowed; char **uuids; int source, vendor, product, version; char **techno, **t; @@ -3141,6 +3225,14 @@ next: btd_device_set_pnpid(device, source, vendor, product, version); } + /* Mark wake allowed */ + wake_allowed = g_key_file_get_boolean(key_file, "General", + "WakeAllowed", NULL); + if (wake_allowed) { + device->mgmt_flags_mask |= DEVICE_FLAG_WAKEABLE; + device->mgmt_flags_value |= DEVICE_FLAG_WAKEABLE; + } + if (store_needed) store_device_info(device); } @@ -3959,6 +4051,39 @@ char *btd_device_get_storage_path(struct btd_device *device, dstaddr, filename); } +void device_add_complete(struct btd_device *device) +{ + bool flag = false; + + /* No flags updated */ + if (!device->mgmt_flags_mask) + return; + + if (device->mgmt_flags_mask & DEVICE_FLAG_WAKEABLE) + { + flag = device->mgmt_flags_value & DEVICE_FLAG_WAKEABLE; + device->wake_allowed = flag; + + store_device_info(device); + g_dbus_emit_property_changed(dbus_conn, device->path, + DEVICE_INTERFACE, "WakeAllowed"); + } + + /* Clear mask and values for next completion */ + device->mgmt_flags_mask = 0; + device->mgmt_flags_value = 0; +} + +uint8_t device_get_flags_mask(struct btd_device *device) +{ + return device->mgmt_flags_mask; +} + +uint8_t device_get_flags_value(struct btd_device *device) +{ + return device->mgmt_flags_value; +} + void btd_device_device_set_name(struct btd_device *device, const char *name) { if (strncmp(name, device->name, MAX_NAME_LENGTH) == 0) diff --git a/src/device.h b/src/device.h index 06b100499..85e33f1cd 100644 --- a/src/device.h +++ b/src/device.h @@ -33,6 +33,10 @@ struct btd_device *device_create_from_storage(struct btd_adapter *adapter, char *btd_device_get_storage_path(struct btd_device *device, const char *filename); +void device_add_complete(struct btd_device *device); +uint8_t device_get_flags_mask(struct btd_device *device); +uint8_t device_get_flags_value(struct btd_device *device); + void btd_device_device_set_name(struct btd_device *device, const char *name); void device_store_cached_name(struct btd_device *dev, const char *name); void device_get_name(struct btd_device *device, char *name, size_t len); @@ -139,6 +143,10 @@ void device_store_svc_chng_ccc(struct btd_device *device, uint8_t bdaddr_type, uint16_t value); void device_load_svc_chng_ccc(struct btd_device *device, uint16_t *ccc_le, uint16_t *ccc_bredr); +bool device_get_wake_support(struct btd_device *device); +void device_set_wake_support(struct btd_device *device, bool wake_support); +bool device_get_wake_allowed(struct btd_device *device); +void device_set_wake_allowed(struct btd_device *device, bool wake_allowed); typedef void (*disconnect_watch) (struct btd_device *device, gboolean removal, void *user_data); From patchwork Fri Mar 20 01:50:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Pandit-Subedi X-Patchwork-Id: 11448275 X-Patchwork-Delegate: luiz.dentz@gmail.com Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8747613B1 for ; Fri, 20 Mar 2020 01:50:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 64AB720754 for ; Fri, 20 Mar 2020 01:50:31 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="CJYztvqu" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727407AbgCTBub (ORCPT ); Thu, 19 Mar 2020 21:50:31 -0400 Received: from mail-pl1-f194.google.com ([209.85.214.194]:36853 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727192AbgCTBua (ORCPT ); Thu, 19 Mar 2020 21:50:30 -0400 Received: by mail-pl1-f194.google.com with SMTP id g2so1853564plo.3 for ; Thu, 19 Mar 2020 18:50:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=i+Juhpb0+ZK6h8BgiB7H9s+Tupk9orFVQTeAOyei+Hc=; b=CJYztvquMIiRPHHYic098oNanMhWn3lwTtlYFurEXrwkEKiCLvMnGRWyR4dq2nIbQ9 xqp+bmbp4Noa9QrH7Y2oeu8AiE9vGtPTJ0PAM2nY37zMBp39N4Zn724mQAEyLHXxAAxc 9zGqfsXX6y3viRaSE5OnImdVtfutgzLn02yyQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=i+Juhpb0+ZK6h8BgiB7H9s+Tupk9orFVQTeAOyei+Hc=; b=bqlk9KUrIecYrJpkiQeCmivs8LKCsftcrLU/8o4A/Y0QxN8l8+BTHsKYz0FduI9Ml8 idqjrie/Lhu8pjFSckUExHwR7rAZmVf8CVMOikMgnYI4x25Ui3W6TGeuhsU1C2HASV5u dAx9B6C/2Id+kYCvv385mpX69/f5Y17TuTRrcA0biMxvZ5oFlE3fO3lLRjdufmXG3qSq nMz1ZC7PYtzVJSPRkXuIjvynXaoFEY++Ff0XQYwEwJYOPngTGV+Yo3SVbOK5NLbMrAGd L6G9/h3tymiM19ki1e/H9kJv2WDgc+IoUSUVLZk+pvSoHOyY6CRf6kFkET+PJYjWiYCh gLTQ== X-Gm-Message-State: ANhLgQ2ta5jcKpwiOtV3AKhdsE/WjcZwt5D/Kj1KWeQuR3Ci3pZ1rWQP hYjckzfLfRocdPlAemK8xrijLQ== X-Google-Smtp-Source: ADFU+vsdLLBE+F44K3pxWGom3wFCTpT8WNHNxQiAx50PCbBuVYOK25uePIVvU+7UHpJ3fVpew5oODg== X-Received: by 2002:a17:902:d915:: with SMTP id c21mr6188632plz.239.1584669029639; Thu, 19 Mar 2020 18:50:29 -0700 (PDT) Received: from apsdesk.mtv.corp.google.com ([2620:15c:202:1:e09a:8d06:a338:aafb]) by smtp.gmail.com with ESMTPSA id 136sm3410485pgh.26.2020.03.19.18.50.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2020 18:50:29 -0700 (PDT) From: Abhishek Pandit-Subedi To: luiz.dentz@gmail.com, marcel@holtmann.org Cc: alainm@chromium.org, chromeos-bluetooth-upstreaming@chromium.org, linux-bluetooth@vger.kernel.org, Abhishek Pandit-Subedi Subject: [BlueZ PATCH v4 3/5] client: Display wake allowed property with info Date: Thu, 19 Mar 2020 18:50:21 -0700 Message-Id: <20200319185000.BlueZ.v4.3.I80d0e557c53f464415742324eb3ff2cc4cdcbc2a@changeid> X-Mailer: git-send-email 2.25.1.696.g5e7596f4ac-goog In-Reply-To: <20200320015023.85896-1-abhishekpandit@chromium.org> References: <20200320015023.85896-1-abhishekpandit@chromium.org> MIME-Version: 1.0 Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Display whether the device is configured as wake allowed when queried with cmd_info. --- Changes in v4: * Renamed WakeCapable to WakeAllowed Changes in v3: None Changes in v2: * Newly added to show whether device is wake capable * Removed automatically setting wake capable for HID devices client/main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/client/main.c b/client/main.c index 422da5593..4953f50f0 100644 --- a/client/main.c +++ b/client/main.c @@ -1637,6 +1637,7 @@ static void cmd_info(int argc, char *argv[]) print_property(proxy, "Trusted"); print_property(proxy, "Blocked"); print_property(proxy, "Connected"); + print_property(proxy, "WakeAllowed"); print_property(proxy, "LegacyPairing"); print_uuids(proxy); print_property(proxy, "Modalias"); From patchwork Fri Mar 20 01:50:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Pandit-Subedi X-Patchwork-Id: 11448277 X-Patchwork-Delegate: luiz.dentz@gmail.com Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D56B313B1 for ; Fri, 20 Mar 2020 01:50:32 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B429920754 for ; Fri, 20 Mar 2020 01:50:32 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="C8E0aD14" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727414AbgCTBuc (ORCPT ); Thu, 19 Mar 2020 21:50:32 -0400 Received: from mail-pj1-f68.google.com ([209.85.216.68]:51584 "EHLO mail-pj1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727192AbgCTBub (ORCPT ); Thu, 19 Mar 2020 21:50:31 -0400 Received: by mail-pj1-f68.google.com with SMTP id hg10so1801586pjb.1 for ; Thu, 19 Mar 2020 18:50:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=PwTkDVax+9S5osced+g7kTgXU9VF2EcYgGp89+K7CWQ=; b=C8E0aD14RozvgrDkMU9hh78zuU+a3EqWbwAMgTZmbN4CsEvI8XwuJcw+5OGbP2VJ3s uEWe/UT2KbZM5FuNOkWUd3UUWiIBsOE4deTQAwXRnf5cEZeHjrDzFcXw/9pBgicn08eg sR6Qijjb8H13uByxxKyq7bMh/JIhGBozruHnE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=PwTkDVax+9S5osced+g7kTgXU9VF2EcYgGp89+K7CWQ=; b=qB0xWh1rwpR6ouNkQozwvfudNFJw+DTzF+QD8YBLqZyWImowUkYCrDGvVyJik36Akf nAk5DjQGVaezTqmPlAzzxFb+3sEeXAaiFHsm4oxtT5YKQCqoVXlzDoM+gXa3nMtfxgYg 5Oc+nFPFwqoYk4YAbtxK19A6e+iVkME3xIGYiCN7XEfwHiCgnK7/CalrZp3S559F3etP 9Cc8ZITWTKNb2pSNF941D6VCZShQ859L6kxikQ8XGEvHvLDmXD7AcTdx6jJFPFZdwv2u Nf6Fxw+Ki2phu2cgHmJZA2OaHiJJkbMYNlzvRJYTndCAExZGXk/An6r3SA0pnIdW3NIm zUrw== X-Gm-Message-State: ANhLgQ2YZh5pkTp8FxKbbS7fBp1dOEIV9H+HUhu5PgEGtbqMOriY1/aY roku0/drDmOE8JzvEHC97hjeSQ== X-Google-Smtp-Source: ADFU+vvZHk7eE6Xif4GCoiBEsY6Pn4IabOoEbn5dNM3dBYOhfEv2dcdA6Rn6YXGdbdi2m7didx1K5Q== X-Received: by 2002:a17:902:904c:: with SMTP id w12mr5816135plz.338.1584669030679; Thu, 19 Mar 2020 18:50:30 -0700 (PDT) Received: from apsdesk.mtv.corp.google.com ([2620:15c:202:1:e09a:8d06:a338:aafb]) by smtp.gmail.com with ESMTPSA id 136sm3410485pgh.26.2020.03.19.18.50.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2020 18:50:30 -0700 (PDT) From: Abhishek Pandit-Subedi To: luiz.dentz@gmail.com, marcel@holtmann.org Cc: alainm@chromium.org, chromeos-bluetooth-upstreaming@chromium.org, linux-bluetooth@vger.kernel.org, Abhishek Pandit-Subedi Subject: [BlueZ PATCH v4 4/5] doc/device-api: Add WakeAllowed Date: Thu, 19 Mar 2020 18:50:22 -0700 Message-Id: <20200319185000.BlueZ.v4.4.I5b076d560ee47afa4c9a8d5602aebf67ffd3d131@changeid> X-Mailer: git-send-email 2.25.1.696.g5e7596f4ac-goog In-Reply-To: <20200320015023.85896-1-abhishekpandit@chromium.org> References: <20200320015023.85896-1-abhishekpandit@chromium.org> MIME-Version: 1.0 Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Add documentation for WakeAllowed, which allows a device to wake the system from suspend. --- Changes in v4: * Renamed WakeCapable to WakeAllowed Changes in v3: * Added documentation for WakeCapable Changes in v2: None doc/device-api.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/device-api.txt b/doc/device-api.txt index 65d8fee37..6b265c73b 100644 --- a/doc/device-api.txt +++ b/doc/device-api.txt @@ -189,6 +189,11 @@ Properties string Address [readonly] drivers will also be removed and no new ones will be probed as long as the device is blocked. + boolean WakeAllowed [readwrite] + + If set to true this device will be allowed to wake the + host processor from system suspend. + string Alias [readwrite] The name alias for the remote device. The alias can From patchwork Fri Mar 20 01:50:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhishek Pandit-Subedi X-Patchwork-Id: 11448281 X-Patchwork-Delegate: luiz.dentz@gmail.com Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C5F3A1893 for ; Fri, 20 Mar 2020 01:50:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A5A1E2076C for ; Fri, 20 Mar 2020 01:50:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="nN4ECh2v" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727402AbgCTBud (ORCPT ); Thu, 19 Mar 2020 21:50:33 -0400 Received: from mail-pl1-f196.google.com ([209.85.214.196]:46670 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727411AbgCTBuc (ORCPT ); Thu, 19 Mar 2020 21:50:32 -0400 Received: by mail-pl1-f196.google.com with SMTP id r3so1832990pls.13 for ; Thu, 19 Mar 2020 18:50:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=DfSSR55MLYDi3PSWtKuQhudT+yQxp3dfMZoaynRORc0=; b=nN4ECh2vEbK6E4nOaAfv8m3kF0O8q6jQr71Prf7fXog6jlgdDV95kXPcAfjYbLPFVx AWTngBBQJL443t4jrpyYllBtOtbqikx0GEtSh2iN9wI7KSxdHJizKNMpHrLAVTqRgs0m zH7pE1s0KoOOiuiA7yiWyEK06EpirH0v/gCpo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=DfSSR55MLYDi3PSWtKuQhudT+yQxp3dfMZoaynRORc0=; b=rMJlUcfIYd2T1w0BHqhfZDZX/dRThUuJtBuNglu8VgCSg4ZMy8qm6u0jaBX0PeK9dA nLPtovdFAcLtGD6HiRyEL5GWDwPVz83rkVVdBn39JZ1tLKvAkFwBxt/A4JDB8q178O+x UYEQUh5O/GrYSZrkuIThIcal2rSF8CUjPlEKgCXybDP8gDzvMEjHMs3NiIWC4iLd26SJ W1alGtJHBhC6NwkuKDkKgMYMFoK7atfpUcHkV8pjmxBfgNOgODx4V9hlD5X6fsQnjgZF jWBdvicOxsFpRFAqzm/bPN7LdK7R6gSHEzlGvunHG0mNHEBoSx1133zt2fvQTc3RTkie hmkw== X-Gm-Message-State: ANhLgQ02tnIvv7Tc+/rh3LZjEQzzGKOJ501uvMBUeforHvWuuatCj8aK Szuj+3JB7U8P1s7jtkxIiw8M1UB4s6k= X-Google-Smtp-Source: ADFU+vsDQbEhsN2tuFHtUsI/7N3So4T9imSCXTf3HpOZDKL+p8NNTg8ql2UrgUz1pzIsY6iXshykqA== X-Received: by 2002:a17:902:82c7:: with SMTP id u7mr1585982plz.10.1584669031576; Thu, 19 Mar 2020 18:50:31 -0700 (PDT) Received: from apsdesk.mtv.corp.google.com ([2620:15c:202:1:e09a:8d06:a338:aafb]) by smtp.gmail.com with ESMTPSA id 136sm3410485pgh.26.2020.03.19.18.50.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2020 18:50:31 -0700 (PDT) From: Abhishek Pandit-Subedi To: luiz.dentz@gmail.com, marcel@holtmann.org Cc: alainm@chromium.org, chromeos-bluetooth-upstreaming@chromium.org, linux-bluetooth@vger.kernel.org, Abhishek Pandit-Subedi Subject: [BlueZ PATCH v4 5/5] input: Make HID devices support wake Date: Thu, 19 Mar 2020 18:50:23 -0700 Message-Id: <20200319185000.BlueZ.v4.5.Ie24be91b472c0a274606191bc4d14df030fe3598@changeid> X-Mailer: git-send-email 2.25.1.696.g5e7596f4ac-goog In-Reply-To: <20200320015023.85896-1-abhishekpandit@chromium.org> References: <20200320015023.85896-1-abhishekpandit@chromium.org> MIME-Version: 1.0 Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org HID devices can wake the host from a suspended state. Mark the profiles to support wake when they are accepted. --- Changes in v4: * Renamed device_set_profile_wake_support to just device_set_wake_support Changes in v3: * Mark HID device to support wake from suspend Changes in v2: None profiles/input/device.c | 1 + profiles/input/hog.c | 1 + 2 files changed, 2 insertions(+) diff --git a/profiles/input/device.c b/profiles/input/device.c index d89da2d7c..d2a4ec82e 100644 --- a/profiles/input/device.c +++ b/profiles/input/device.c @@ -1402,6 +1402,7 @@ int input_device_register(struct btd_service *service) } btd_service_set_user_data(service, idev); + device_set_wake_support(device, true); return 0; } diff --git a/profiles/input/hog.c b/profiles/input/hog.c index 327a1d1c3..0e4bd1c34 100644 --- a/profiles/input/hog.c +++ b/profiles/input/hog.c @@ -168,6 +168,7 @@ static int hog_probe(struct btd_service *service) return -EINVAL; btd_service_set_user_data(service, dev); + device_set_wake_support(device, true); return 0; }