2023-02-13 12:10:15

by Francesco Dolcini

[permalink] [raw]
Subject: [PATCH v3 0/5] Bluetooth: hci_mrvl: Add serdev support for 88W8997

From: Francesco Dolcini <[email protected]>

Add serdev support for the 88W8997 from NXP (previously Marvell). It includes
support for changing the baud rate. The command to change the baud rate is
taken from the user manual UM11483 Rev. 9 in section 7 (Bring-up of Bluetooth
interfaces) from NXP.

v3:
- Use __hci_cmd_sync_status instead of __hci_cmd_sync

v2:
- Fix the subject as pointed out by Krzysztof. Thanks!
- Fix indentation in marvell-bluetooth.yaml
- Fix compiler warning for kernel builds without CONFIG_OF enabled

Stefan Eichenberger (5):
dt-bindings: bluetooth: marvell: add 88W8997
dt-bindings: bluetooth: marvell: add max-speed property
Bluetooth: hci_mrvl: use maybe_unused macro for device tree ids
Bluetooth: hci_mrvl: Add serdev support for 88W8997
arm64: dts: imx8mp-verdin: add 88W8997 serdev to uart4

.../bindings/net/marvell-bluetooth.yaml | 20 ++++-
.../dts/freescale/imx8mp-verdin-wifi.dtsi | 5 ++
drivers/bluetooth/hci_mrvl.c | 90 ++++++++++++++++---
3 files changed, 104 insertions(+), 11 deletions(-)

--
2.25.1



2023-02-13 12:10:31

by Francesco Dolcini

[permalink] [raw]
Subject: [PATCH v3 1/5] dt-bindings: bluetooth: marvell: add 88W8997

From: Stefan Eichenberger <[email protected]>

Update the documentation with the device tree binding for the Marvell
88W8997 bluetooth device.

Signed-off-by: Stefan Eichenberger <[email protected]>
Acked-by: Krzysztof Kozlowski <[email protected]>
Signed-off-by: Francesco Dolcini <[email protected]>
---
v3: no changes
v2:
- removed redundant "DT binding" from commit message title
- add acked-by Krzysztof
---
Documentation/devicetree/bindings/net/marvell-bluetooth.yaml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/net/marvell-bluetooth.yaml b/Documentation/devicetree/bindings/net/marvell-bluetooth.yaml
index 309ef21a1e37..83b64ed730f5 100644
--- a/Documentation/devicetree/bindings/net/marvell-bluetooth.yaml
+++ b/Documentation/devicetree/bindings/net/marvell-bluetooth.yaml
@@ -15,7 +15,9 @@ maintainers:

properties:
compatible:
- const: mrvl,88w8897
+ enum:
+ - mrvl,88w8897
+ - mrvl,88w8997

required:
- compatible
--
2.25.1


2023-02-13 12:10:49

by Francesco Dolcini

[permalink] [raw]
Subject: [PATCH v3 2/5] dt-bindings: bluetooth: marvell: add max-speed property

From: Stefan Eichenberger <[email protected]>

The 88W8997 bluetooth module supports setting the max-speed property.

Signed-off-by: Stefan Eichenberger <[email protected]>
Signed-off-by: Francesco Dolcini <[email protected]>
Reviewed-by: Krzysztof Kozlowski <[email protected]>
---
v3: add Reviewed-by Krzysztof
v2: fixed indentation
---
.../bindings/net/marvell-bluetooth.yaml | 16 ++++++++++++++++
1 file changed, 16 insertions(+)

diff --git a/Documentation/devicetree/bindings/net/marvell-bluetooth.yaml b/Documentation/devicetree/bindings/net/marvell-bluetooth.yaml
index 83b64ed730f5..516c63ad165a 100644
--- a/Documentation/devicetree/bindings/net/marvell-bluetooth.yaml
+++ b/Documentation/devicetree/bindings/net/marvell-bluetooth.yaml
@@ -19,9 +19,25 @@ properties:
- mrvl,88w8897
- mrvl,88w8997

+ max-speed:
+ description: see Documentation/devicetree/bindings/serial/serial.yaml
+
required:
- compatible

+allOf:
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: mrvl,88w8997
+ then:
+ properties:
+ max-speed: true
+ else:
+ properties:
+ max-speed: false
+
additionalProperties: false

examples:
--
2.25.1


2023-02-13 12:11:59

by Francesco Dolcini

[permalink] [raw]
Subject: [PATCH v3 3/5] Bluetooth: hci_mrvl: use maybe_unused macro for device tree ids

From: Stefan Eichenberger <[email protected]>

Use the maybe_unused macro for the device tree ids instead of #ifdef
CONFIG_OF. This makes it easier to add support for new devices.

Signed-off-by: Stefan Eichenberger <[email protected]>
Signed-off-by: Francesco Dolcini <[email protected]>
---
v3: no changes
v2: new patch
---
drivers/bluetooth/hci_mrvl.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/bluetooth/hci_mrvl.c b/drivers/bluetooth/hci_mrvl.c
index fbc3f7c3a5c7..eaa9c51cacfa 100644
--- a/drivers/bluetooth/hci_mrvl.c
+++ b/drivers/bluetooth/hci_mrvl.c
@@ -414,13 +414,11 @@ static void mrvl_serdev_remove(struct serdev_device *serdev)
hci_uart_unregister_device(&mrvldev->hu);
}

-#ifdef CONFIG_OF
-static const struct of_device_id mrvl_bluetooth_of_match[] = {
+static const struct of_device_id __maybe_unused mrvl_bluetooth_of_match[] = {
{ .compatible = "mrvl,88w8897" },
{ },
};
MODULE_DEVICE_TABLE(of, mrvl_bluetooth_of_match);
-#endif

static struct serdev_device_driver mrvl_serdev_driver = {
.probe = mrvl_serdev_probe,
--
2.25.1


2023-02-13 12:13:00

by Francesco Dolcini

[permalink] [raw]
Subject: [PATCH v3 4/5] Bluetooth: hci_mrvl: Add serdev support for 88W8997

From: Stefan Eichenberger <[email protected]>

Add serdev support for the 88W8997 from NXP (previously Marvell). It
includes support for changing the baud rate. The command to change the
baud rate is taken from the user manual UM11483 Rev. 9 in section 7
(Bring-up of Bluetooth interfaces) from NXP.

Signed-off-by: Stefan Eichenberger <[email protected]>
Signed-off-by: Francesco Dolcini <[email protected]>
---
v3: use __hci_cmd_sync_status instead of __hci_cmd_sync
v2: no changes
---
drivers/bluetooth/hci_mrvl.c | 86 +++++++++++++++++++++++++++++++++---
1 file changed, 79 insertions(+), 7 deletions(-)

diff --git a/drivers/bluetooth/hci_mrvl.c b/drivers/bluetooth/hci_mrvl.c
index eaa9c51cacfa..e08222395772 100644
--- a/drivers/bluetooth/hci_mrvl.c
+++ b/drivers/bluetooth/hci_mrvl.c
@@ -27,10 +27,12 @@
#define MRVL_ACK 0x5A
#define MRVL_NAK 0xBF
#define MRVL_RAW_DATA 0x1F
+#define MRVL_SET_BAUDRATE 0xFC09

enum {
STATE_CHIP_VER_PENDING,
STATE_FW_REQ_PENDING,
+ STATE_FW_LOADED,
};

struct mrvl_data {
@@ -254,6 +256,14 @@ static int mrvl_recv(struct hci_uart *hu, const void *data, int count)
if (!test_bit(HCI_UART_REGISTERED, &hu->flags))
return -EUNATCH;

+ /* We might receive some noise when there is no firmware loaded. Therefore,
+ * we drop data if the firmware is not loaded yet and if there is no fw load
+ * request pending.
+ */
+ if (!test_bit(STATE_FW_REQ_PENDING, &mrvl->flags) &&
+ !test_bit(STATE_FW_LOADED, &mrvl->flags))
+ return count;
+
mrvl->rx_skb = h4_recv_buf(hu->hdev, mrvl->rx_skb, data, count,
mrvl_recv_pkts,
ARRAY_SIZE(mrvl_recv_pkts));
@@ -354,6 +364,7 @@ static int mrvl_load_firmware(struct hci_dev *hdev, const char *name)
static int mrvl_setup(struct hci_uart *hu)
{
int err;
+ struct mrvl_data *mrvl = hu->priv;

hci_uart_set_flow_control(hu, true);

@@ -367,9 +378,9 @@ static int mrvl_setup(struct hci_uart *hu)
hci_uart_wait_until_sent(hu);

if (hu->serdev)
- serdev_device_set_baudrate(hu->serdev, 3000000);
+ serdev_device_set_baudrate(hu->serdev, hu->oper_speed);
else
- hci_uart_set_baudrate(hu, 3000000);
+ hci_uart_set_baudrate(hu, hu->oper_speed);

hci_uart_set_flow_control(hu, false);

@@ -377,13 +388,54 @@ static int mrvl_setup(struct hci_uart *hu)
if (err)
return err;

+ set_bit(STATE_FW_LOADED, &mrvl->flags);
+
+ return 0;
+}
+
+static int mrvl_set_baudrate(struct hci_uart *hu, unsigned int speed)
+{
+ int err;
+ struct mrvl_data *mrvl = hu->priv;
+ __le32 speed_le = cpu_to_le32(speed);
+
+ /* The firmware might be loaded by the Wifi driver over SDIO. We wait
+ * up to 10s for the CTS to go up. Afterward, we know that the firmware
+ * is ready.
+ */
+ err = serdev_device_wait_for_cts(hu->serdev, true, 10000);
+ if (err) {
+ bt_dev_err(hu->hdev, "Wait for CTS failed with %d\n", err);
+ return err;
+ }
+
+ set_bit(STATE_FW_LOADED, &mrvl->flags);
+
+ err = __hci_cmd_sync_status(hu->hdev, MRVL_SET_BAUDRATE,
+ sizeof(speed_le), &speed_le,
+ HCI_INIT_TIMEOUT);
+ if (err) {
+ bt_dev_err(hu->hdev, "send command failed: %d", err);
+ return err;
+ }
+
+ serdev_device_set_baudrate(hu->serdev, speed);
+
+ /* We forcefully have to send a command to the bluetooth module so that
+ * the driver detects it after a baudrate change. This is foreseen by
+ * hci_serdev by setting HCI_UART_VND_DETECT which then causes a dummy
+ * local version read.
+ */
+ set_bit(HCI_UART_VND_DETECT, &hu->hdev_flags);
+
return 0;
}

-static const struct hci_uart_proto mrvl_proto = {
+static const struct hci_uart_proto mrvl_proto_8897 = {
.id = HCI_UART_MRVL,
.name = "Marvell",
.init_speed = 115200,
+ .oper_speed = 3000000,
.open = mrvl_open,
.close = mrvl_close,
.flush = mrvl_flush,
@@ -393,18 +445,37 @@ static const struct hci_uart_proto mrvl_proto = {
.dequeue = mrvl_dequeue,
};

+static const struct hci_uart_proto mrvl_proto_8997 = {
+ .id = HCI_UART_MRVL,
+ .name = "Marvell 8997",
+ .init_speed = 115200,
+ .oper_speed = 3000000,
+ .open = mrvl_open,
+ .close = mrvl_close,
+ .flush = mrvl_flush,
+ .set_baudrate = mrvl_set_baudrate,
+ .recv = mrvl_recv,
+ .enqueue = mrvl_enqueue,
+ .dequeue = mrvl_dequeue,
+};
+
static int mrvl_serdev_probe(struct serdev_device *serdev)
{
struct mrvl_serdev *mrvldev;
+ const struct hci_uart_proto *mrvl_proto = device_get_match_data(&serdev->dev);

mrvldev = devm_kzalloc(&serdev->dev, sizeof(*mrvldev), GFP_KERNEL);
if (!mrvldev)
return -ENOMEM;

+ mrvldev->hu.oper_speed = mrvl_proto->oper_speed;
+ if (mrvl_proto->set_baudrate)
+ of_property_read_u32(serdev->dev.of_node, "max-speed", &mrvldev->hu.oper_speed);
+
mrvldev->hu.serdev = serdev;
serdev_device_set_drvdata(serdev, mrvldev);

- return hci_uart_register_device(&mrvldev->hu, &mrvl_proto);
+ return hci_uart_register_device(&mrvldev->hu, mrvl_proto);
}

static void mrvl_serdev_remove(struct serdev_device *serdev)
@@ -415,7 +486,8 @@ static void mrvl_serdev_remove(struct serdev_device *serdev)
}

static const struct of_device_id __maybe_unused mrvl_bluetooth_of_match[] = {
- { .compatible = "mrvl,88w8897" },
+ { .compatible = "mrvl,88w8897", .data = &mrvl_proto_8897},
+ { .compatible = "mrvl,88w8997", .data = &mrvl_proto_8997},
{ },
};
MODULE_DEVICE_TABLE(of, mrvl_bluetooth_of_match);
@@ -433,12 +505,12 @@ int __init mrvl_init(void)
{
serdev_device_driver_register(&mrvl_serdev_driver);

- return hci_uart_register_proto(&mrvl_proto);
+ return hci_uart_register_proto(&mrvl_proto_8897);
}

int __exit mrvl_deinit(void)
{
serdev_device_driver_unregister(&mrvl_serdev_driver);

- return hci_uart_unregister_proto(&mrvl_proto);
+ return hci_uart_unregister_proto(&mrvl_proto_8897);
}
--
2.25.1


2023-02-13 12:43:27

by bluez.test.bot

[permalink] [raw]
Subject: RE: Bluetooth: hci_mrvl: Add serdev support for 88W8997

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=721269

---Test result---

Test Summary:
CheckPatch PASS 2.69 seconds
GitLint PASS 1.29 seconds
SubjectPrefix FAIL 0.80 seconds
BuildKernel PASS 31.32 seconds
CheckAllWarning PASS 34.87 seconds
CheckSparse WARNING 39.45 seconds
CheckSmatch PASS 108.71 seconds
BuildKernel32 PASS 30.45 seconds
TestRunnerSetup PASS 436.43 seconds
TestRunner_l2cap-tester PASS 15.89 seconds
TestRunner_iso-tester PASS 16.65 seconds
TestRunner_bnep-tester PASS 5.40 seconds
TestRunner_mgmt-tester PASS 108.06 seconds
TestRunner_rfcomm-tester PASS 8.60 seconds
TestRunner_sco-tester PASS 7.90 seconds
TestRunner_ioctl-tester PASS 9.22 seconds
TestRunner_mesh-tester PASS 6.85 seconds
TestRunner_smp-tester PASS 7.91 seconds
TestRunner_userchan-tester PASS 5.64 seconds
IncrementalBuild PASS 42.02 seconds

Details
##############################
Test: SubjectPrefix - FAIL
Desc: Check subject contains "Bluetooth" prefix
Output:
"Bluetooth: " prefix is not specified in the subject
"Bluetooth: " prefix is not specified in the subject
##############################
Test: CheckSparse - WARNING
Desc: Run sparse tool with linux kernel
Output:
drivers/bluetooth/hci_mrvl.c:170:23: warning: restricted __le16 degrades to integerdrivers/bluetooth/hci_mrvl.c:203:23: warning: restricted __le16 degrades to integerdrivers/bluetooth/hci_mrvl.c:170:23: warning: restricted __le16 degrades to integerdrivers/bluetooth/hci_mrvl.c:203:23: warning: restricted __le16 degrades to integer


---
Regards,
Linux Bluetooth

2023-02-15 20:36:50

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: [PATCH v3 0/5] Bluetooth: hci_mrvl: Add serdev support for 88W8997

Hi Francesco,

On Mon, Feb 13, 2023 at 4:09 AM Francesco Dolcini <[email protected]> wrote:
>
> From: Francesco Dolcini <[email protected]>
>
> Add serdev support for the 88W8997 from NXP (previously Marvell). It includes
> support for changing the baud rate. The command to change the baud rate is
> taken from the user manual UM11483 Rev. 9 in section 7 (Bring-up of Bluetooth
> interfaces) from NXP.
>
> v3:
> - Use __hci_cmd_sync_status instead of __hci_cmd_sync
>
> v2:
> - Fix the subject as pointed out by Krzysztof. Thanks!
> - Fix indentation in marvell-bluetooth.yaml
> - Fix compiler warning for kernel builds without CONFIG_OF enabled
>
> Stefan Eichenberger (5):
> dt-bindings: bluetooth: marvell: add 88W8997
> dt-bindings: bluetooth: marvell: add max-speed property
> Bluetooth: hci_mrvl: use maybe_unused macro for device tree ids
> Bluetooth: hci_mrvl: Add serdev support for 88W8997
> arm64: dts: imx8mp-verdin: add 88W8997 serdev to uart4
>
> .../bindings/net/marvell-bluetooth.yaml | 20 ++++-
> .../dts/freescale/imx8mp-verdin-wifi.dtsi | 5 ++
> drivers/bluetooth/hci_mrvl.c | 90 ++++++++++++++++---
> 3 files changed, 104 insertions(+), 11 deletions(-)
>
> --
> 2.25.1

There seems to be missing one patch 5/5:

https://patchwork.kernel.org/project/bluetooth/list/?series=721269

Other than that the Bluetooth parts seem fine, and perhaps can be
merged if the patch above is not really required.


--
Luiz Augusto von Dentz

2023-02-15 20:41:16

by Francesco Dolcini

[permalink] [raw]
Subject: Re: [PATCH v3 0/5] Bluetooth: hci_mrvl: Add serdev support for 88W8997

Hello Luiz

On Wed, Feb 15, 2023 at 12:36:34PM -0800, Luiz Augusto von Dentz wrote:
> On Mon, Feb 13, 2023 at 4:09 AM Francesco Dolcini <[email protected]> wrote:
> >
> > From: Francesco Dolcini <[email protected]>
> >
> > Add serdev support for the 88W8997 from NXP (previously Marvell). It includes
> > support for changing the baud rate. The command to change the baud rate is
> > taken from the user manual UM11483 Rev. 9 in section 7 (Bring-up of Bluetooth
> > interfaces) from NXP.
> >
> > v3:
> > - Use __hci_cmd_sync_status instead of __hci_cmd_sync
> >
> > v2:
> > - Fix the subject as pointed out by Krzysztof. Thanks!
> > - Fix indentation in marvell-bluetooth.yaml
> > - Fix compiler warning for kernel builds without CONFIG_OF enabled
> >
> > Stefan Eichenberger (5):
> > dt-bindings: bluetooth: marvell: add 88W8997
> > dt-bindings: bluetooth: marvell: add max-speed property
> > Bluetooth: hci_mrvl: use maybe_unused macro for device tree ids
> > Bluetooth: hci_mrvl: Add serdev support for 88W8997
> > arm64: dts: imx8mp-verdin: add 88W8997 serdev to uart4
> >
> > .../bindings/net/marvell-bluetooth.yaml | 20 ++++-
> > .../dts/freescale/imx8mp-verdin-wifi.dtsi | 5 ++
> > drivers/bluetooth/hci_mrvl.c | 90 ++++++++++++++++---
> > 3 files changed, 104 insertions(+), 11 deletions(-)
> >
> > --
> > 2.25.1
>
> There seems to be missing one patch 5/5:
>
> https://patchwork.kernel.org/project/bluetooth/list/?series=721269
>
> Other than that the Bluetooth parts seem fine, and perhaps can be
> merged if the patch above is not really required.

In v3 I decided to not send it to the BT mailing list, since this is
supposed to go through Shawn and the iMX/SOC tree.

Given that it would be great if you could apply patches 1-4.

Thanks,
Francesco



2023-02-15 21:20:25

by patchwork-bot+bluetooth

[permalink] [raw]
Subject: Re: [PATCH v3 0/5] Bluetooth: hci_mrvl: Add serdev support for 88W8997

Hello:

This series was applied to bluetooth/bluetooth-next.git (master)
by Luiz Augusto von Dentz <[email protected]>:

On Mon, 13 Feb 2023 13:09:21 +0100 you wrote:
> From: Francesco Dolcini <[email protected]>
>
> Add serdev support for the 88W8997 from NXP (previously Marvell). It includes
> support for changing the baud rate. The command to change the baud rate is
> taken from the user manual UM11483 Rev. 9 in section 7 (Bring-up of Bluetooth
> interfaces) from NXP.
>
> [...]

Here is the summary with links:
- [v3,1/5] dt-bindings: bluetooth: marvell: add 88W8997
https://git.kernel.org/bluetooth/bluetooth-next/c/f48823aa0c4f
- [v3,2/5] dt-bindings: bluetooth: marvell: add max-speed property
https://git.kernel.org/bluetooth/bluetooth-next/c/d7303dce9fcb
- [v3,3/5] Bluetooth: hci_mrvl: use maybe_unused macro for device tree ids
https://git.kernel.org/bluetooth/bluetooth-next/c/e275614465ec
- [v3,4/5] Bluetooth: hci_mrvl: Add serdev support for 88W8997
https://git.kernel.org/bluetooth/bluetooth-next/c/58c6156a4d4b

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html