Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp3874556ybl; Tue, 21 Jan 2020 08:36:12 -0800 (PST) X-Google-Smtp-Source: APXvYqyw8aaTPxf2KFp5C584gNFyl8feRcuGC6oHH8No0xx5IypoO0etSsYRsByMQYzKf8lLejEc X-Received: by 2002:a9d:7e8a:: with SMTP id m10mr4002157otp.27.1579624572243; Tue, 21 Jan 2020 08:36:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579624572; cv=none; d=google.com; s=arc-20160816; b=u738kBRyzxKZwoJMG6Y7eLErm9JwcwHTjv+d3JTD6yNZyJVWoMYxVRKX0XLjfEwa6W DEXLtt7qWPoLQxk+DsPLT+E7sQHn8j9KRKnKWvPKe5pkb3f1dyS1iRKNmlcQEA9a1VLr GF2KzFFr+6FwPFGxhXjefmN5uCYAIgKj9Q4XyjwhnAlQaBjazBfqRZ8WP4bgv2hNCSyn Sxn9Xt3vkQbn5hHSygD9Zp9u1HF8VDCEq4pGJv22sHnu6TmXaWjTE+05xgX05xKDsO/8 ZTce0iYhhgNAdYVxHOnC0rTjK4GBgIr3CfHZ4dKdx+/MOIECVO6BBLylmf0+xdiZ2RWI sl9A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:to:references:message-id :content-transfer-encoding:cc:date:in-reply-to:from:subject :mime-version; bh=av6GlGf0WldffAeWpwoRHxxMDlnz85oDaTt02vejGLc=; b=rJsBNW05h4X6ZT05+bhrvwV+BVoKfH1qqd936Z4PinmsnAVJUOyFFYx2RuYltwgAn3 xhARwUAv5f/Rm1LG1E9ed7/iRxo34ucysN+Hr5bCkS9WhgibHsWwyQaYzyrEmnfNQJqc f9Z9+2aOI/hkcVvaC4pgU2yUCFM+mgOo1y+8i5AWk1ETTVXxWSz/o2ls7ZmzhtlNLAPz 0tRjxRFKZdF6vDVq4D7aJfa6kNLHq8e5xvgrmssZGTtq+8EAf6dt8MQIkHTLm4bu7CEJ 6YzZH5g+kPFKKWyQwfDEU6fkwctDIcHf23eOChl5QvWFbSdEtp7545k/aUdL0I+n8bDt GBuQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k8si23455049otp.13.2020.01.21.08.35.59; Tue, 21 Jan 2020 08:36:12 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729017AbgAUQfy convert rfc822-to-8bit (ORCPT + 99 others); Tue, 21 Jan 2020 11:35:54 -0500 Received: from coyote.holtmann.net ([212.227.132.17]:58810 "EHLO mail.holtmann.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726714AbgAUQfy (ORCPT ); Tue, 21 Jan 2020 11:35:54 -0500 Received: from marcel-macpro.fritz.box (p4FEFC5A7.dip0.t-ipconnect.de [79.239.197.167]) by mail.holtmann.org (Postfix) with ESMTPSA id 00A92CECE3; Tue, 21 Jan 2020 17:45:10 +0100 (CET) Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 13.0 \(3608.40.2.2.4\)) Subject: Re: [RFC PATCH 1/2] Bluetooth: Add mgmt op set_wake_capable From: Marcel Holtmann In-Reply-To: <20200117132623.RFC.1.I797e2f4cb824299043e771f3ab9cef86ee09f4db@changeid> Date: Tue, 21 Jan 2020 17:35:51 +0100 Cc: Luiz Augusto von Dentz , alainm@chromium.org, linux-bluetooth@vger.kernel.org, chromeos-bluetooth-upstreaming@chromium.org, "David S. Miller" , Johan Hedberg , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8BIT Message-Id: References: <20200117212705.57436-1-abhishekpandit@chromium.org> <20200117132623.RFC.1.I797e2f4cb824299043e771f3ab9cef86ee09f4db@changeid> To: Abhishek Pandit-Subedi X-Mailer: Apple Mail (2.3608.40.2.2.4) Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Hi Abhishek, > When the system is suspended, only some connected Bluetooth devices > cause user input that should wake the system (mostly HID devices). Add > a list to keep track of devices that can wake the system and add > a management API to let userspace tell the kernel whether a device is > wake capable or not. > > Signed-off-by: Abhishek Pandit-Subedi > --- > > include/net/bluetooth/hci_core.h | 1 + > include/net/bluetooth/mgmt.h | 7 ++++++ > net/bluetooth/hci_core.c | 1 + > net/bluetooth/mgmt.c | 42 ++++++++++++++++++++++++++++++++ > 4 files changed, 51 insertions(+) > > diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h > index 89ecf0a80aa1..ce4bebcb0265 100644 > --- a/include/net/bluetooth/hci_core.h > +++ b/include/net/bluetooth/hci_core.h > @@ -394,6 +394,7 @@ struct hci_dev { > struct list_head mgmt_pending; > struct list_head blacklist; > struct list_head whitelist; > + struct list_head wakeable; > struct list_head uuids; > struct list_head link_keys; > struct list_head long_term_keys; > diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h > index a90666af05bd..283ba5320bdb 100644 > --- a/include/net/bluetooth/mgmt.h > +++ b/include/net/bluetooth/mgmt.h > @@ -671,6 +671,13 @@ struct mgmt_cp_set_blocked_keys { > } __packed; > #define MGMT_OP_SET_BLOCKED_KEYS_SIZE 2 > > +#define MGMT_OP_SET_WAKE_CAPABLE 0x0047 > +#define MGMT_SET_WAKE_CAPABLE_SIZE 8 > +struct mgmt_cp_set_wake_capable { > + struct mgmt_addr_info addr; > + u8 wake_capable; > +} __packed; > + please also send a patch for doc/mgmt-api.txt describing these opcodes. I would also like to have the discussion if it might be better to add an extra Action parameter to Add Device. We want to differentiate between allow incoming connection that allows to wakeup and the one that doesn’t. Another option is to create an Add Extended Device command. Main reason here is that I don’t want to end up in the situation where you have to add a device and then send another 10 commands to set its features. > #define MGMT_EV_CMD_COMPLETE 0x0001 > struct mgmt_ev_cmd_complete { > __le16 opcode; > diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c > index 1ca7508b6ca7..7057b9b65173 100644 > --- a/net/bluetooth/hci_core.c > +++ b/net/bluetooth/hci_core.c > @@ -3299,6 +3299,7 @@ struct hci_dev *hci_alloc_dev(void) > INIT_LIST_HEAD(&hdev->mgmt_pending); > INIT_LIST_HEAD(&hdev->blacklist); > INIT_LIST_HEAD(&hdev->whitelist); > + INIT_LIST_HEAD(&hdev->wakeable); > INIT_LIST_HEAD(&hdev->uuids); > INIT_LIST_HEAD(&hdev->link_keys); > INIT_LIST_HEAD(&hdev->long_term_keys); > diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c > index 0dc610faab70..95092130f16c 100644 > --- a/net/bluetooth/mgmt.c > +++ b/net/bluetooth/mgmt.c > @@ -106,7 +106,10 @@ static const u16 mgmt_commands[] = { > MGMT_OP_START_LIMITED_DISCOVERY, > MGMT_OP_READ_EXT_INFO, > MGMT_OP_SET_APPEARANCE, > + MGMT_OP_GET_PHY_CONFIGURATION, > + MGMT_OP_SET_PHY_CONFIGURATION, These are unrelated to this patch. > MGMT_OP_SET_BLOCKED_KEYS, > + MGMT_OP_SET_WAKE_CAPABLE, > }; > > static const u16 mgmt_events[] = { > @@ -4663,6 +4666,37 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, > return err; > } > > +static int set_wake_capable(struct sock *sk, struct hci_dev *hdev, void *data, > + u16 len) > +{ > + int err; > + u8 status; > + struct mgmt_cp_set_wake_capable *cp = data; > + u8 addr_type = cp->addr.type == BDADDR_BREDR ? > + cp->addr.type : > + le_addr_type(cp->addr.type); > + > + BT_DBG("Set wake capable %pMR (type 0x%x) = 0x%x\n", &cp->addr.bdaddr, > + addr_type, cp->wake_capable); > + > + if (cp->wake_capable) > + err = hci_bdaddr_list_add(&hdev->wakeable, &cp->addr.bdaddr, > + addr_type); > + else > + err = hci_bdaddr_list_del(&hdev->wakeable, &cp->addr.bdaddr, > + addr_type); > + > + if (!err || err == -EEXIST || err == -ENOENT) > + status = MGMT_STATUS_SUCCESS; > + else > + status = MGMT_STATUS_FAILED; > + > + err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_SET_WAKE_CAPABLE, status, > + cp, sizeof(*cp)); > + > + return err; > +} > + > static void set_bredr_complete(struct hci_dev *hdev, u8 status, u16 opcode) > { > struct mgmt_pending_cmd *cmd; > @@ -5791,6 +5825,13 @@ static int remove_device(struct sock *sk, struct hci_dev *hdev, > err = hci_bdaddr_list_del(&hdev->whitelist, > &cp->addr.bdaddr, > cp->addr.type); > + > + /* Don't check result since it either succeeds or device > + * wasn't there (not wakeable or invalid params as > + * covered by deleting from whitelist). > + */ > + hci_bdaddr_list_del(&hdev->wakeable, &cp->addr.bdaddr, > + cp->addr.type); > if (err) { > err = mgmt_cmd_complete(sk, hdev->id, > MGMT_OP_REMOVE_DEVICE, > @@ -6990,6 +7031,7 @@ static const struct hci_mgmt_handler mgmt_handlers[] = { > { set_phy_configuration, MGMT_SET_PHY_CONFIGURATION_SIZE }, > { set_blocked_keys, MGMT_OP_SET_BLOCKED_KEYS_SIZE, > HCI_MGMT_VAR_LEN }, > + { set_wake_capable, MGMT_SET_WAKE_CAPABLE_SIZE }, > }; > Regards Marcel