From: Matthias Kaehlcke <mka@chromium.org>
To: Marcel Holtmann <marcel@holtmann.org>
Cc: Johan Hedberg <johan.hedberg@gmail.com>,
"David S . Miller" <davem@davemloft.net>,
Loic Poulain <loic.poulain@linaro.org>,
linux-bluetooth@vger.kernel.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org,
Balakrishna Godavarthi <bgodavar@codeaurora.org>,
Brian Norris <briannorris@chromium.org>,
Dmitry Grinberg <dmitrygr@google.com>
Subject: Re: [PATCH RESEND v2 1/3] Bluetooth: Add quirk for reading BD_ADDR from fwnode property
Date: Wed, 19 Dec 2018 11:19:49 -0800 [thread overview]
Message-ID: <20181219191949.GD109358@google.com> (raw)
In-Reply-To: <5F86A55E-2893-4D16-BA5C-36A60CB46DBC@holtmann.org>
Hi Marcel,
thanks for the review!
On Wed, Dec 19, 2018 at 03:22:12PM +0100, Marcel Holtmann wrote:
> > Add HCI_QUIRK_USE_BDADDR_PROPERTY to allow controllers to retrieve
> > the public Bluetooth address from the firmware node property
> > 'local-bd-address'. If quirk is set and the property does not exist
> > or is invalid the controller is marked as unconfigured.
> >
> > Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
> > Reviewed-by: Balakrishna Godavarthi <bgodavar@codeaurora.org>
> > Tested-by: Balakrishna Godavarthi <bgodavar@codeaurora.org>
> > ---
> > Changes in v2:
> > - added check for return value of ->setup()
> > - only read BD_ADDR from the property if it isn't assigned yet. This
> > is needed to support configuration from user space
> > - refactored the branch of the new quirk to get rid of 'bd_addr_set'
> > - added 'Reviewed-by: Balakrishna Godavarthi <bgodavar@codeaurora.org>' tag
> > ---
> > include/net/bluetooth/hci.h | 12 ++++++++++
> > net/bluetooth/hci_core.c | 45 +++++++++++++++++++++++++++++++++++++
> > net/bluetooth/mgmt.c | 6 +++--
> > 3 files changed, 61 insertions(+), 2 deletions(-)
> >
> > diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
> > index c36dc1e20556a..fbba43e9bef5b 100644
> > --- a/include/net/bluetooth/hci.h
> > +++ b/include/net/bluetooth/hci.h
> > @@ -158,6 +158,18 @@ enum {
> > */
> > HCI_QUIRK_INVALID_BDADDR,
> >
> > + /* When this quirk is set, the public Bluetooth address
> > + * initially reported by HCI Read BD Address command
> > + * is considered invalid. The public BD Address can be
> > + * specified in the fwnode property 'local-bd-address'.
> > + * If this property does not exist or is invalid controller
> > + * configuration is required before this device can be used.
> > + *
> > + * This quirk can be set before hci_register_dev is called or
> > + * during the hdev->setup vendor callback.
> > + */
> > + HCI_QUIRK_USE_BDADDR_PROPERTY,
> > +
> > /* When this quirk is set, the duplicate filtering during
> > * scanning is based on Bluetooth devices addresses. To allow
> > * RSSI based updates, restart scanning if needed.
> > diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
> > index 7352fe85674be..d4149005a661e 100644
> > --- a/net/bluetooth/hci_core.c
> > +++ b/net/bluetooth/hci_core.c
> > @@ -30,6 +30,7 @@
> > #include <linux/rfkill.h>
> > #include <linux/debugfs.h>
> > #include <linux/crypto.h>
> > +#include <linux/property.h>
> > #include <asm/unaligned.h>
> >
> > #include <net/bluetooth/bluetooth.h>
> > @@ -1355,6 +1356,36 @@ int hci_inquiry(void __user *arg)
> > return err;
> > }
> >
> > +/**
> > + * hci_dev_get_bd_addr_from_property - Get the Bluetooth Device Address
> > + * (BD_ADDR) for a HCI device from
> > + * a firmware node property.
> > + * @hdev: The HCI device
> > + *
> > + * Search the firmware node for 'local-bd-address'.
> > + *
> > + * All-zero BD addresses are rejected, because those could be properties
> > + * that exist in the firmware tables, but were not updated by the firmware. For
> > + * example, the DTS could define 'local-bd-address', with zero BD addresses.
> > + */
> > +static int hci_dev_get_bd_addr_from_property(struct hci_dev *hdev)
> > +{
> > + struct fwnode_handle *fwnode = dev_fwnode(hdev->dev.parent);
> > + bdaddr_t ba;
> > + int ret;
> > +
> > + ret = fwnode_property_read_u8_array(fwnode, "local-bd-address",
> > + (u8 *)&ba, sizeof(ba));
> > + if (ret < 0)
> > + return ret;
> > + if (!bacmp(&ba, BDADDR_ANY))
> > + return -ENODATA;
> > +
> > + hdev->public_addr = ba;
>
> this needs to use bacpy btw.
will change
> > +
> > + return 0;
> > +}
>
> Make this void since the return value is actually not used right now.
ok
> > +
> > static int hci_dev_do_open(struct hci_dev *hdev)
> > {
> > int ret = 0;
> > @@ -1422,6 +1453,20 @@ static int hci_dev_do_open(struct hci_dev *hdev)
> > if (hdev->setup)
> > ret = hdev->setup(hdev);
> >
> > + if (ret)
> > + goto setup_failed;
> > +
> > + if (test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) {
> > + if (!bacmp(&hdev->public_addr, BDADDR_ANY))
> > + hci_dev_get_bd_addr_from_property(hdev);
>
> So I would move the bacmp() into
> hci_dev_get_bd_addr_from_property. Mainly since you also write the
> field there.
Personally I'm not a fan of functions that pretend to do something and
then do it conditionally, IMO it obscures the actual code flow.
I'm open to change it though if you have a strong preference for not
having the check in hci_dev_do_open().
> > + if (!bacmp(&hdev->public_addr, BDADDR_ANY) ||
> > + !hdev->set_bdaddr ||
> > + hdev->set_bdaddr(hdev, &hdev->public_addr))
> > + hci_dev_set_flag(hdev, HCI_UNCONFIGURED);
> > + }
>
> So this one I don’t like since it makes my brain hurt when I have to read it and understand it.
I agree, it's an ugly construct.
> I think this needs to be like this:
>
> if (bacmp(&hdev->public_addr, BDADDR_ANY) &&
> hdev->set_bdaddr)
> ret = hdev->set_bdaddr(hdev, &hdev->public_addr);
> else
> err = -EADDRNOTAVAIL;
>
> That will fail the power on procedure which is the right thing to do if the local-bd-address is not present. The driver decided that it should be in DT and so enforce that.
Ok, will change as suggested.
Thanks
Matthias
next prev parent reply other threads:[~2018-12-19 19:20 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-04 20:16 [PATCH RESEND v2 0/3] Add quirk for reading BD_ADDR from fwnode property Matthias Kaehlcke
2018-12-04 20:16 ` [PATCH RESEND v2 1/3] Bluetooth: " Matthias Kaehlcke
[not found] ` <5F86A55E-2893-4D16-BA5C-36A60CB46DBC@holtmann.org>
2018-12-19 19:19 ` Matthias Kaehlcke [this message]
2018-12-04 20:16 ` [PATCH RESEND v2 2/3] Bluetooth: btqcomsmd: use HCI_QUIRK_USE_BDADDR_PROPERTY Matthias Kaehlcke
2018-12-04 20:16 ` [PATCH RESEND v2 3/3] Bluetooth: hci_qca: Set HCI_QUIRK_USE_BDADDR_PROPERTY for wcn3990 Matthias Kaehlcke
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181219191949.GD109358@google.com \
--to=mka@chromium.org \
--cc=bgodavar@codeaurora.org \
--cc=briannorris@chromium.org \
--cc=davem@davemloft.net \
--cc=dmitrygr@google.com \
--cc=johan.hedberg@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=loic.poulain@linaro.org \
--cc=marcel@holtmann.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.