Message ID | 20230118122817.42466-4-francesco@dolcini.it |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp2330923wrn; Wed, 18 Jan 2023 05:16:48 -0800 (PST) X-Google-Smtp-Source: AMrXdXtFVzDdDJDn0EYrkpIUpyU5nD/uXYgRhSw1+DzijYiAXfrjoVocndW4DU/HE7dKf4UAXTbR X-Received: by 2002:a17:906:bc58:b0:872:2cc4:6882 with SMTP id s24-20020a170906bc5800b008722cc46882mr8373562ejv.58.1674047808019; Wed, 18 Jan 2023 05:16:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674047808; cv=none; d=google.com; s=arc-20160816; b=zKimlN1wV8KGu7VWV62MpMxMfkVFjioSTHTWz7S1bXcXhOOa8vZy2cHYxg3kTkHkUz OMiG5tEATEo5sLFl5GqoLnTZqY9rXgspOm9QeFCjRNvSjXMxFGWYqmx68AgfxaDEvxp5 ytYCpzs4uqM3pmPpi4QkltI3J08ofaErmD41yuvF89j4dh2DKazNkIH8HXqg5MQgX2Ik Pd39cl5D7D888jChKUGZhcfxu7/5lay/ksPdZtprCDcLEaY7+NnxX6Fn+PJTebh+T5Aj O8H2AuVp0QmFYIm6sj6LYClGBsIc0uTQ4/TeazTLSSUQQm3BECd+4l7nnLa9LKi+qeKH uLew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=TIFq5IP6dueUNqC9iJKL9p0LnLpABtl5jDnkDoGeEjo=; b=RV/0HOUiIe2sa8gQFf6u4QYNsRllhqMRaA6u6s0MWCMP+f3sVGaV0aGDqlaAdod3jB ck01T0Ux5apFCM0a3/grRstsuvUo13sDjOm2pHc3FEVKkqHr9Lqt7orUq6n28r8QN64b /M2XekIyl/W37HDOvGNXfP1S8Nwq8ZRxygL4gd2C6gDGZZIYf8o8hpCJyceblUBgPaoL jfy1wRBd8k+sO+3Pb/L7ZV1Rfj9PGyK6fden3QMHXmcymShOkDS7V1LFnrapayn511Oz RmPIc50VCBrVzkQojV7MmxakYeJ2DWgHOL0WFjIIzdKHDi63eln8VUefVswKcB4i2Yzt 89Iw== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@mailserver.it header.s=mailsrv header.b=i3W5HMpz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id sh12-20020a1709076e8c00b0087329ff5952si5083935ejc.219.2023.01.18.05.16.24; Wed, 18 Jan 2023 05:16:47 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=fail header.i=@mailserver.it header.s=mailsrv header.b=i3W5HMpz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231237AbjARNHx (ORCPT <rfc822;pfffrao@gmail.com> + 99 others); Wed, 18 Jan 2023 08:07:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39618 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229960AbjARNHC (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Wed, 18 Jan 2023 08:07:02 -0500 Received: from smtp-out-01.comm2000.it (smtp-out-01.comm2000.it [212.97.32.64]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0636059D0; Wed, 18 Jan 2023 04:29:11 -0800 (PST) Received: from francesco-nb.toradex.int (31-10-206-125.static.upc.ch [31.10.206.125]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: francesco@dolcini.it) by smtp-out-01.comm2000.it (Postfix) with ESMTPSA id B243E843668; Wed, 18 Jan 2023 13:29:06 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mailserver.it; s=mailsrv; t=1674044947; bh=lFI62O4/YaxDuSl/4LVxPamR7TzR5iTlbicCyccwPQI=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=i3W5HMpzPkeeqxWO1gphqRUZfSeVFpqOyDQrewGCSKstW+9TUgu+zfA3uZ6gOpMaM NezHepUbzeCTgMcMzYIW3bAuDR3vRz8Skgok3ocVe+48ZZ4csePyTA+c1A2Me0Wq1F qUGwYmHEnjHfL6ZXm9tCiAVZQgliz/0Jm2C1veCKSS7g4ze2hNJSShc1BwnUiMhaMg 74iQrJ1uYiuHqmcf+JA15dlo4z4jlH6WOPhlvcLbTzBTr2sMMzMLNUsl3Vx0djUWQU nBCIExqXSQCC7QPVk0UeLWE+ieRxiOECovxTQe/ZD62OQFoUCSAAMBhCJBI02xjL74 R2bixg8FCHafQ== From: Francesco Dolcini <francesco@dolcini.it> To: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-bluetooth@vger.kernel.org, Marcel Holtmann <marcel@holtmann.org>, Luiz Augusto von Dentz <luiz.dentz@gmail.com> Cc: Stefan Eichenberger <stefan.eichenberger@toradex.com>, "David S. Miller" <davem@davemloft.net>, Eric Dumazet <edumazet@google.com>, Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>, Rob Herring <robh+dt@kernel.org>, Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>, Johan Hedberg <johan.hedberg@gmail.com>, Sascha Hauer <s.hauer@pengutronix.de>, Francesco Dolcini <francesco.dolcini@toradex.com> Subject: [PATCH v1 3/4] Bluetooth: hci_mrvl: Add serdev support for 88W8997 Date: Wed, 18 Jan 2023 13:28:16 +0100 Message-Id: <20230118122817.42466-4-francesco@dolcini.it> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230118122817.42466-1-francesco@dolcini.it> References: <20230118122817.42466-1-francesco@dolcini.it> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1755366354028328052?= X-GMAIL-MSGID: =?utf-8?q?1755366354028328052?= |
Series |
Bluetooth: hci_mrvl: Add serdev support for 88W8997
|
|
Commit Message
Francesco Dolcini
Jan. 18, 2023, 12:28 p.m. UTC
From: Stefan Eichenberger <stefan.eichenberger@toradex.com> 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 <stefan.eichenberger@toradex.com> Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com> --- drivers/bluetooth/hci_mrvl.c | 88 +++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 7 deletions(-)
Comments
Hi Francesco, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on robh/for-next] [also build test WARNING on bluetooth-next/master bluetooth/master horms-ipvs/master net/master net-next/master linus/master v6.2-rc4 next-20230118] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Francesco-Dolcini/dt-bindings-bluetooth-marvell-add-88W8997-DT-binding/20230118-210919 base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next patch link: https://lore.kernel.org/r/20230118122817.42466-4-francesco%40dolcini.it patch subject: [PATCH v1 3/4] Bluetooth: hci_mrvl: Add serdev support for 88W8997 config: i386-randconfig-s002 (https://download.01.org/0day-ci/archive/20230119/202301190442.n6v4c2yc-lkp@intel.com/config) compiler: gcc-11 (Debian 11.3.0-8) 11.3.0 reproduce: # apt-get install sparse # sparse version: v0.6.4-39-gce1a6720-dirty # https://github.com/intel-lab-lkp/linux/commit/2ae116c8ad209e0bf11559519915e511c44c28be git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Francesco-Dolcini/dt-bindings-bluetooth-marvell-add-88W8997-DT-binding/20230118-210919 git checkout 2ae116c8ad209e0bf11559519915e511c44c28be # save the config file mkdir build_dir && cp config build_dir/.config make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 olddefconfig make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 SHELL=/bin/bash drivers/bluetooth/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> drivers/bluetooth/hci_mrvl.c:450:36: warning: 'mrvl_proto_8997' defined but not used [-Wunused-const-variable=] 450 | static const struct hci_uart_proto mrvl_proto_8997 = { | ^~~~~~~~~~~~~~~ vim +/mrvl_proto_8997 +450 drivers/bluetooth/hci_mrvl.c 449 > 450 static const struct hci_uart_proto mrvl_proto_8997 = { 451 .id = HCI_UART_MRVL, 452 .name = "Marvell 8997", 453 .init_speed = 115200, 454 .oper_speed = 3000000, 455 .open = mrvl_open, 456 .close = mrvl_close, 457 .flush = mrvl_flush, 458 .set_baudrate = mrvl_set_baudrate, 459 .recv = mrvl_recv, 460 .enqueue = mrvl_enqueue, 461 .dequeue = mrvl_dequeue, 462 }; 463
Hi Francesco, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on robh/for-next] [also build test WARNING on bluetooth-next/master bluetooth/master horms-ipvs/master net/master net-next/master linus/master v6.2-rc5 next-20230123] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Francesco-Dolcini/dt-bindings-bluetooth-marvell-add-88W8997-DT-binding/20230118-210919 base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next patch link: https://lore.kernel.org/r/20230118122817.42466-4-francesco%40dolcini.it patch subject: [PATCH v1 3/4] Bluetooth: hci_mrvl: Add serdev support for 88W8997 config: hexagon-randconfig-r021-20230123 (https://download.01.org/0day-ci/archive/20230124/202301241423.sEVD92vC-lkp@intel.com/config) compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 4196ca3278f78c6e19246e54ab0ecb364e37d66a) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/2ae116c8ad209e0bf11559519915e511c44c28be git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Francesco-Dolcini/dt-bindings-bluetooth-marvell-add-88W8997-DT-binding/20230118-210919 git checkout 2ae116c8ad209e0bf11559519915e511c44c28be # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash drivers/bluetooth/ lib/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): In file included from drivers/bluetooth/hci_mrvl.c:12: In file included from include/linux/skbuff.h:17: In file included from include/linux/bvec.h:10: In file included from include/linux/highmem.h:12: In file included from include/linux/hardirq.h:11: In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/hexagon/include/asm/io.h:334: include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __raw_readb(PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/little_endian.h:37:51: note: expanded from macro '__le16_to_cpu' #define __le16_to_cpu(x) ((__force __u16)(__le16)(x)) ^ In file included from drivers/bluetooth/hci_mrvl.c:12: In file included from include/linux/skbuff.h:17: In file included from include/linux/bvec.h:10: In file included from include/linux/highmem.h:12: In file included from include/linux/hardirq.h:11: In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/hexagon/include/asm/io.h:334: include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__le32_to_cpu' #define __le32_to_cpu(x) ((__force __u32)(__le32)(x)) ^ In file included from drivers/bluetooth/hci_mrvl.c:12: In file included from include/linux/skbuff.h:17: In file included from include/linux/bvec.h:10: In file included from include/linux/highmem.h:12: In file included from include/linux/hardirq.h:11: In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/hexagon/include/asm/io.h:334: include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writeb(value, PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr); ~~~~~~~~~~ ^ >> drivers/bluetooth/hci_mrvl.c:450:36: warning: unused variable 'mrvl_proto_8997' [-Wunused-const-variable] static const struct hci_uart_proto mrvl_proto_8997 = { ^ 7 warnings generated. vim +/mrvl_proto_8997 +450 drivers/bluetooth/hci_mrvl.c 449 > 450 static const struct hci_uart_proto mrvl_proto_8997 = { 451 .id = HCI_UART_MRVL, 452 .name = "Marvell 8997", 453 .init_speed = 115200, 454 .oper_speed = 3000000, 455 .open = mrvl_open, 456 .close = mrvl_close, 457 .flush = mrvl_flush, 458 .set_baudrate = mrvl_set_baudrate, 459 .recv = mrvl_recv, 460 .enqueue = mrvl_enqueue, 461 .dequeue = mrvl_dequeue, 462 }; 463
Hi Francesco, On Wed, Jan 18, 2023 at 4:30 AM Francesco Dolcini <francesco@dolcini.it> wrote: > > From: Stefan Eichenberger <stefan.eichenberger@toradex.com> > > 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 <stefan.eichenberger@toradex.com> > Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com> > --- > drivers/bluetooth/hci_mrvl.c | 88 +++++++++++++++++++++++++++++++++--- > 1 file changed, 81 insertions(+), 7 deletions(-) > > diff --git a/drivers/bluetooth/hci_mrvl.c b/drivers/bluetooth/hci_mrvl.c > index fbc3f7c3a5c7..86f548998a18 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,56 @@ 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 sk_buff *skb; > + 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); > + > + skb = __hci_cmd_sync(hu->hdev, MRVL_SET_BAUDRATE, > + sizeof(speed_le), &speed_le, > + HCI_INIT_TIMEOUT); > + if (IS_ERR(skb)) { > + bt_dev_err(hu->hdev, "send command failed: %ld", PTR_ERR(skb)); > + return PTR_ERR(skb); > + } > + kfree_skb(skb); If you don't care about the skb just the command status use __hci_cmd_sync_status instead. > + > + 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 +447,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) > @@ -416,7 +489,8 @@ static void mrvl_serdev_remove(struct serdev_device *serdev) > > #ifdef CONFIG_OF > static const struct of_device_id 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); > @@ -435,12 +509,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 >
Hi Francesco, On Mon, Jan 23, 2023 at 10:38 PM kernel test robot <lkp@intel.com> wrote: > > Hi Francesco, > > Thank you for the patch! Perhaps something to improve: > > [auto build test WARNING on robh/for-next] > [also build test WARNING on bluetooth-next/master bluetooth/master horms-ipvs/master net/master net-next/master linus/master v6.2-rc5 next-20230123] > [If your patch is applied to the wrong git tree, kindly drop us a note. > And when submitting patch, we suggest to use '--base' as documented in > https://git-scm.com/docs/git-format-patch#_base_tree_information] > > url: https://github.com/intel-lab-lkp/linux/commits/Francesco-Dolcini/dt-bindings-bluetooth-marvell-add-88W8997-DT-binding/20230118-210919 > base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next > patch link: https://lore.kernel.org/r/20230118122817.42466-4-francesco%40dolcini.it > patch subject: [PATCH v1 3/4] Bluetooth: hci_mrvl: Add serdev support for 88W8997 > config: hexagon-randconfig-r021-20230123 (https://download.01.org/0day-ci/archive/20230124/202301241423.sEVD92vC-lkp@intel.com/config) > compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 4196ca3278f78c6e19246e54ab0ecb364e37d66a) > reproduce (this is a W=1 build): > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross > chmod +x ~/bin/make.cross > # https://github.com/intel-lab-lkp/linux/commit/2ae116c8ad209e0bf11559519915e511c44c28be > git remote add linux-review https://github.com/intel-lab-lkp/linux > git fetch --no-tags linux-review Francesco-Dolcini/dt-bindings-bluetooth-marvell-add-88W8997-DT-binding/20230118-210919 > git checkout 2ae116c8ad209e0bf11559519915e511c44c28be > # save the config file > mkdir build_dir && cp config build_dir/.config > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon olddefconfig > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash drivers/bluetooth/ lib/ > > If you fix the issue, kindly add following tag where applicable > | Reported-by: kernel test robot <lkp@intel.com> > > All warnings (new ones prefixed by >>): > > In file included from drivers/bluetooth/hci_mrvl.c:12: > In file included from include/linux/skbuff.h:17: > In file included from include/linux/bvec.h:10: > In file included from include/linux/highmem.h:12: > In file included from include/linux/hardirq.h:11: > In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: > In file included from include/asm-generic/hardirq.h:17: > In file included from include/linux/irq.h:20: > In file included from include/linux/io.h:13: > In file included from arch/hexagon/include/asm/io.h:334: > include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > val = __raw_readb(PCI_IOBASE + addr); > ~~~~~~~~~~ ^ > include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr)); > ~~~~~~~~~~ ^ > include/uapi/linux/byteorder/little_endian.h:37:51: note: expanded from macro '__le16_to_cpu' > #define __le16_to_cpu(x) ((__force __u16)(__le16)(x)) > ^ > In file included from drivers/bluetooth/hci_mrvl.c:12: > In file included from include/linux/skbuff.h:17: > In file included from include/linux/bvec.h:10: > In file included from include/linux/highmem.h:12: > In file included from include/linux/hardirq.h:11: > In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: > In file included from include/asm-generic/hardirq.h:17: > In file included from include/linux/irq.h:20: > In file included from include/linux/io.h:13: > In file included from arch/hexagon/include/asm/io.h:334: > include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr)); > ~~~~~~~~~~ ^ > include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__le32_to_cpu' > #define __le32_to_cpu(x) ((__force __u32)(__le32)(x)) > ^ > In file included from drivers/bluetooth/hci_mrvl.c:12: > In file included from include/linux/skbuff.h:17: > In file included from include/linux/bvec.h:10: > In file included from include/linux/highmem.h:12: > In file included from include/linux/hardirq.h:11: > In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: > In file included from include/asm-generic/hardirq.h:17: > In file included from include/linux/irq.h:20: > In file included from include/linux/io.h:13: > In file included from arch/hexagon/include/asm/io.h:334: > include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > __raw_writeb(value, PCI_IOBASE + addr); > ~~~~~~~~~~ ^ > include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr); > ~~~~~~~~~~ ^ > include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr); > ~~~~~~~~~~ ^ > >> drivers/bluetooth/hci_mrvl.c:450:36: warning: unused variable 'mrvl_proto_8997' [-Wunused-const-variable] > static const struct hci_uart_proto mrvl_proto_8997 = { This last error seems to be caused by your changes, please fix it.
On Fri, Feb 10, 2023 at 10:48:08AM -0800, Luiz Augusto von Dentz wrote: > Hi Francesco, > > On Mon, Jan 23, 2023 at 10:38 PM kernel test robot <lkp@intel.com> wrote: > > > > Hi Francesco, > > > > Thank you for the patch! Perhaps something to improve: > > > > [auto build test WARNING on robh/for-next] > > [also build test WARNING on bluetooth-next/master bluetooth/master horms-ipvs/master net/master net-next/master linus/master v6.2-rc5 next-20230123] > > [If your patch is applied to the wrong git tree, kindly drop us a note. > > And when submitting patch, we suggest to use '--base' as documented in > > https://git-scm.com/docs/git-format-patch#_base_tree_information] > > > > url: https://github.com/intel-lab-lkp/linux/commits/Francesco-Dolcini/dt-bindings-bluetooth-marvell-add-88W8997-DT-binding/20230118-210919 > > base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next > > patch link: https://lore.kernel.org/r/20230118122817.42466-4-francesco%40dolcini.it > > patch subject: [PATCH v1 3/4] Bluetooth: hci_mrvl: Add serdev support for 88W8997 > > config: hexagon-randconfig-r021-20230123 (https://download.01.org/0day-ci/archive/20230124/202301241423.sEVD92vC-lkp@intel.com/config) > > compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 4196ca3278f78c6e19246e54ab0ecb364e37d66a) > > reproduce (this is a W=1 build): > > wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross > > chmod +x ~/bin/make.cross > > # https://github.com/intel-lab-lkp/linux/commit/2ae116c8ad209e0bf11559519915e511c44c28be > > git remote add linux-review https://github.com/intel-lab-lkp/linux > > git fetch --no-tags linux-review Francesco-Dolcini/dt-bindings-bluetooth-marvell-add-88W8997-DT-binding/20230118-210919 > > git checkout 2ae116c8ad209e0bf11559519915e511c44c28be > > # save the config file > > mkdir build_dir && cp config build_dir/.config > > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon olddefconfig > > COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash drivers/bluetooth/ lib/ > > > > If you fix the issue, kindly add following tag where applicable > > | Reported-by: kernel test robot <lkp@intel.com> > > > > All warnings (new ones prefixed by >>): > > > > In file included from drivers/bluetooth/hci_mrvl.c:12: > > In file included from include/linux/skbuff.h:17: > > In file included from include/linux/bvec.h:10: > > In file included from include/linux/highmem.h:12: > > In file included from include/linux/hardirq.h:11: > > In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: > > In file included from include/asm-generic/hardirq.h:17: > > In file included from include/linux/irq.h:20: > > In file included from include/linux/io.h:13: > > In file included from arch/hexagon/include/asm/io.h:334: > > include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > > val = __raw_readb(PCI_IOBASE + addr); > > ~~~~~~~~~~ ^ > > include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > > val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr)); > > ~~~~~~~~~~ ^ > > include/uapi/linux/byteorder/little_endian.h:37:51: note: expanded from macro '__le16_to_cpu' > > #define __le16_to_cpu(x) ((__force __u16)(__le16)(x)) > > ^ > > In file included from drivers/bluetooth/hci_mrvl.c:12: > > In file included from include/linux/skbuff.h:17: > > In file included from include/linux/bvec.h:10: > > In file included from include/linux/highmem.h:12: > > In file included from include/linux/hardirq.h:11: > > In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: > > In file included from include/asm-generic/hardirq.h:17: > > In file included from include/linux/irq.h:20: > > In file included from include/linux/io.h:13: > > In file included from arch/hexagon/include/asm/io.h:334: > > include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > > val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr)); > > ~~~~~~~~~~ ^ > > include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__le32_to_cpu' > > #define __le32_to_cpu(x) ((__force __u32)(__le32)(x)) > > ^ > > In file included from drivers/bluetooth/hci_mrvl.c:12: > > In file included from include/linux/skbuff.h:17: > > In file included from include/linux/bvec.h:10: > > In file included from include/linux/highmem.h:12: > > In file included from include/linux/hardirq.h:11: > > In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1: > > In file included from include/asm-generic/hardirq.h:17: > > In file included from include/linux/irq.h:20: > > In file included from include/linux/io.h:13: > > In file included from arch/hexagon/include/asm/io.h:334: > > include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > > __raw_writeb(value, PCI_IOBASE + addr); > > ~~~~~~~~~~ ^ > > include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > > __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr); > > ~~~~~~~~~~ ^ > > include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] > > __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr); > > ~~~~~~~~~~ ^ > > >> drivers/bluetooth/hci_mrvl.c:450:36: warning: unused variable 'mrvl_proto_8997' [-Wunused-const-variable] > > static const struct hci_uart_proto mrvl_proto_8997 = { > > This last error seems to be caused by your changes, please fix it. this is supposed to be fixed in v2.
diff --git a/drivers/bluetooth/hci_mrvl.c b/drivers/bluetooth/hci_mrvl.c index fbc3f7c3a5c7..86f548998a18 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,56 @@ 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 sk_buff *skb; + 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); + + skb = __hci_cmd_sync(hu->hdev, MRVL_SET_BAUDRATE, + sizeof(speed_le), &speed_le, + HCI_INIT_TIMEOUT); + if (IS_ERR(skb)) { + bt_dev_err(hu->hdev, "send command failed: %ld", PTR_ERR(skb)); + return PTR_ERR(skb); + } + kfree_skb(skb); + + 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 +447,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) @@ -416,7 +489,8 @@ static void mrvl_serdev_remove(struct serdev_device *serdev) #ifdef CONFIG_OF static const struct of_device_id 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); @@ -435,12 +509,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); }