lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID:
 <DB9PR04MB8429D531C76CD31AF66864419273A@DB9PR04MB8429.eurprd04.prod.outlook.com>
Date: Tue, 17 Jun 2025 02:53:11 +0000
From: Sherry Sun <sherry.sun@....com>
To: Neeraj Sanjay Kale <neeraj.sanjaykale@....com>, "marcel@...tmann.org"
	<marcel@...tmann.org>, "luiz.dentz@...il.com" <luiz.dentz@...il.com>,
	"robh@...nel.org" <robh@...nel.org>, "krzk+dt@...nel.org"
	<krzk+dt@...nel.org>, "conor+dt@...nel.org" <conor+dt@...nel.org>
CC: "linux-bluetooth@...r.kernel.org" <linux-bluetooth@...r.kernel.org>,
	"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
	"devicetree@...r.kernel.org" <devicetree@...r.kernel.org>, Amitkumar Karwar
	<amitkumar.karwar@....com>, Manjeet Gupta <manjeet.gupta@....com>
Subject: RE: [PATCH v1 2/2] Bluetooth: btnxpuart: Add support for 4M baudrate



> -----Original Message-----
> From: Neeraj Sanjay Kale <neeraj.sanjaykale@....com>
> Sent: Monday, June 16, 2025 11:09 PM
> To: marcel@...tmann.org; luiz.dentz@...il.com; robh@...nel.org;
> krzk+dt@...nel.org; conor+dt@...nel.org
> Cc: linux-bluetooth@...r.kernel.org; linux-kernel@...r.kernel.org;
> devicetree@...r.kernel.org; Amitkumar Karwar
> <amitkumar.karwar@....com>; Neeraj Sanjay Kale
> <neeraj.sanjaykale@....com>; Sherry Sun <sherry.sun@....com>; Manjeet
> Gupta <manjeet.gupta@....com>
> Subject: [PATCH v1 2/2] Bluetooth: btnxpuart: Add support for 4M baudrate
> 
> This adds support for 4000000 as secondary baudrate.
> This value is selected from device tree property "secondary-baudrate"
> which is then used to download FW chunks, and as operational baudrate
> after HCI initialization is done.
> 
> Signed-off-by: Neeraj Sanjay Kale <neeraj.sanjaykale@....com>
> ---
>  drivers/bluetooth/btnxpuart.c | 29 ++++++++++++++++++++---------
>  1 file changed, 20 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/bluetooth/btnxpuart.c b/drivers/bluetooth/btnxpuart.c
> index 6b13feed06df..e2cd568bdffe 100644
> --- a/drivers/bluetooth/btnxpuart.c
> +++ b/drivers/bluetooth/btnxpuart.c
> @@ -73,7 +73,8 @@
>  #define FW_AUTH_ENC		0xc0
> 
>  #define HCI_NXP_PRI_BAUDRATE	115200
> -#define HCI_NXP_SEC_BAUDRATE	3000000
> +#define HCI_NXP_SEC_BAUDRATE_3M	3000000
> +#define HCI_NXP_SEC_BAUDRATE_4M	4000000
> 
>  #define MAX_FW_FILE_NAME_LEN    50
> 
> @@ -201,6 +202,7 @@ struct btnxpuart_dev {
>  	u32 new_baudrate;
>  	u32 current_baudrate;
>  	u32 fw_init_baudrate;
> +	u32 secondary_baudrate;
>  	enum bootloader_param_change timeout_changed;
>  	enum bootloader_param_change baudrate_changed;
>  	bool helper_downloaded;
> @@ -802,7 +804,10 @@ static bool nxp_fw_change_baudrate(struct hci_dev
> *hdev, u16 req_len)
>  		nxpdev->fw_v3_offset_correction += req_len;
>  	} else if (req_len == sizeof(uart_config)) {
>  		uart_config.clkdiv.address = __cpu_to_le32(clkdivaddr);
> -		uart_config.clkdiv.value = __cpu_to_le32(0x00c00000);
> +		if (nxpdev->new_baudrate == HCI_NXP_SEC_BAUDRATE_4M)
> +			uart_config.clkdiv.value =
> __cpu_to_le32(0x01000000);
> +		else
> +			uart_config.clkdiv.value =
> __cpu_to_le32(0x00c00000);
>  		uart_config.uartdiv.address = __cpu_to_le32(uartdivaddr);
>  		uart_config.uartdiv.value = __cpu_to_le32(1);
>  		uart_config.mcr.address = __cpu_to_le32(uartmcraddr); @@
> -969,9 +974,9 @@ static int nxp_recv_fw_req_v1(struct hci_dev *hdev, struct
> sk_buff *skb)
>  			if (nxp_fw_change_baudrate(hdev, len)) {
>  				nxpdev->baudrate_changed = changed;
>  				serdev_device_set_baudrate(nxpdev->serdev,
> -
> HCI_NXP_SEC_BAUDRATE);
> +
> HCI_NXP_SEC_BAUDRATE_3M);
>  				serdev_device_set_flow_control(nxpdev-
> >serdev, true);
> -				nxpdev->current_baudrate =
> HCI_NXP_SEC_BAUDRATE;
> +				nxpdev->current_baudrate =
> HCI_NXP_SEC_BAUDRATE_3M;
>  			}
>  			goto free_skb;
>  		}
> @@ -992,7 +997,7 @@ static int nxp_recv_fw_req_v1(struct hci_dev *hdev,
> struct sk_buff *skb)
>  			nxpdev->helper_downloaded = true;
>  			serdev_device_wait_until_sent(nxpdev->serdev, 0);
>  			serdev_device_set_baudrate(nxpdev->serdev,
> -						   HCI_NXP_SEC_BAUDRATE);
> +
> HCI_NXP_SEC_BAUDRATE_3M);

Hi Neeraj,

Does this mean that some legacy BT chips using nxp_recv_fw_req_v1() don't support 4Mbps?
If so, please add comments in the commit message.

>  			serdev_device_set_flow_control(nxpdev->serdev,
> true);
>  		} else {
>  			clear_bit(BTNXPUART_FW_DOWNLOADING,
> &nxpdev->tx_state); @@ -1216,12 +1221,13 @@ static int
> nxp_recv_fw_req_v3(struct hci_dev *hdev, struct sk_buff *skb)
>  	}
> 
>  	if (nxpdev->baudrate_changed != changed) {
> +		nxpdev->new_baudrate = nxpdev->secondary_baudrate;
>  		if (nxp_fw_change_baudrate(hdev, len)) {
>  			nxpdev->baudrate_changed = cmd_sent;
>  			serdev_device_set_baudrate(nxpdev->serdev,
> -						   HCI_NXP_SEC_BAUDRATE);
> +						   nxpdev-
> >secondary_baudrate);
>  			serdev_device_set_flow_control(nxpdev->serdev,
> true);
> -			nxpdev->current_baudrate =
> HCI_NXP_SEC_BAUDRATE;
> +			nxpdev->current_baudrate = nxpdev-
> >secondary_baudrate;
>  		}
>  		goto free_skb;
>  	}
> @@ -1447,8 +1453,8 @@ static int nxp_post_init(struct hci_dev *hdev)
>  	struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev);
>  	struct ps_data *psdata = &nxpdev->psdata;
> 
> -	if (nxpdev->current_baudrate != HCI_NXP_SEC_BAUDRATE) {
> -		nxpdev->new_baudrate = HCI_NXP_SEC_BAUDRATE;
> +	if (nxpdev->current_baudrate != nxpdev->secondary_baudrate) {
> +		nxpdev->new_baudrate = nxpdev->secondary_baudrate;
>  		nxp_set_baudrate_cmd(hdev, NULL);
>  	}
>  	if (psdata->cur_h2c_wakeupmode != psdata->h2c_wakeupmode) @@
> -1773,6 +1779,11 @@ static int nxp_serdev_probe(struct serdev_device
> *serdev)
>  	if (!nxpdev->fw_init_baudrate)
>  		nxpdev->fw_init_baudrate = FW_INIT_BAUDRATE;
> 
> +	device_property_read_u32(&nxpdev->serdev->dev, "secondary-
> baudrate",
> +				 &nxpdev->secondary_baudrate);
> +	if (!nxpdev->secondary_baudrate)
> +		nxpdev->secondary_baudrate =
> HCI_NXP_SEC_BAUDRATE_3M;
> +

What if the user sets the wrong secondary_baudrate in dts (not 3M or 4M)?
Need to add the corresponding error handling here. Make sure the value is 3M or 4M, otherwise report an error log.

Best Regards
Sherry

>  	set_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state);
> 
>  	crc8_populate_msb(crc8_table, POLYNOMIAL8);
> --
> 2.34.1


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ