forked from mirrors/linux
		
	Bluetooth: btnxpuart: fix recv_buf() return value
Serdev recv_buf() callback is supposed to return the amount of bytes
consumed, therefore an int in between 0 and count.
Do not return a negative number in case of issue, just print an error
and return count. Before this change, in case of error, the returned
negative number was internally converted to 0 in ttyport_receive_buf,
now when the receive buffer is corrupted we return the size of the whole
received data (`count`). This should allow for better recovery in case
receiver/transmitter get out of sync if some data is lost.
This fixes a WARN in ttyport_receive_buf().
  Bluetooth: hci0: Frame reassembly failed (-84)
  ------------[ cut here ]------------
  serial serial0: receive_buf returns -84 (count = 6)
  WARNING: CPU: 0 PID: 37 at drivers/tty/serdev/serdev-ttyport.c:37 ttyport_receive_buf+0xd8/0xf8
  Modules linked in: mwifiex_sdio(+) ...
  CPU: 0 PID: 37 Comm: kworker/u4:2 Not tainted 6.7.0-rc2-00147-gf1a09972a45a #1
  Hardware name: Toradex Verdin AM62 WB on Verdin Development Board (DT)
  Workqueue: events_unbound flush_to_ldisc
  pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
  pc : ttyport_receive_buf+0xd8/0xf8
  lr : ttyport_receive_buf+0xd8/0xf8
...
  Call trace:
   ttyport_receive_buf+0xd8/0xf8
   flush_to_ldisc+0xbc/0x1a4
   process_scheduled_works+0x16c/0x28c
Closes: https://lore.kernel.org/all/ZWEIhcUXfutb5SY6@francesco-nb.int.toradex.com/
Fixes: 689ca16e52 ("Bluetooth: NXP: Add protocol support for NXP Bluetooth chipsets")
Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
			
			
This commit is contained in:
		
							parent
							
								
									ca6d2adf8d
								
							
						
					
					
						commit
						94d0539425
					
				
					 1 changed files with 3 additions and 4 deletions
				
			
		|  | @ -1276,11 +1276,10 @@ static int btnxpuart_receive_buf(struct serdev_device *serdev, const u8 *data, | |||
| 	if (IS_ERR(nxpdev->rx_skb)) { | ||||
| 		int err = PTR_ERR(nxpdev->rx_skb); | ||||
| 		/* Safe to ignore out-of-sync bootloader signatures */ | ||||
| 		if (is_fw_downloading(nxpdev)) | ||||
| 			return count; | ||||
| 		bt_dev_err(nxpdev->hdev, "Frame reassembly failed (%d)", err); | ||||
| 		if (!is_fw_downloading(nxpdev)) | ||||
| 			bt_dev_err(nxpdev->hdev, "Frame reassembly failed (%d)", err); | ||||
| 		nxpdev->rx_skb = NULL; | ||||
| 		return err; | ||||
| 		return count; | ||||
| 	} | ||||
| 	if (!is_fw_downloading(nxpdev)) | ||||
| 		nxpdev->hdev->stat.byte_rx += count; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Francesco Dolcini
						Francesco Dolcini