Skip to content

Commit 9e080b5

Browse files
committed
Bluetooth: btnxpuart: Fix sparse warnings
This fixes the following sparse warnings: drivers/bluetooth/btnxpuart.c:681:23: sparse: sparse: restricted __le16 degrades to integer drivers/bluetooth/btnxpuart.c:690:82: sparse: sparse: incorrect type in argument 2 (different base types) @@ expected unsigned short [usertype] req_len @@ got restricted __le16 [usertype] len @@ drivers/bluetooth/btnxpuart.c:690:82: sparse: expected unsigned short [usertype] req_len drivers/bluetooth/btnxpuart.c:690:82: sparse: got restricted __le16 [usertype] len drivers/bluetooth/btnxpuart.c:694:84: sparse: sparse: incorrect type in argument 2 (different base types) @@ expected unsigned short [usertype] req_len @@ got restricted __le16 [usertype] len @@ drivers/bluetooth/btnxpuart.c:694:84: sparse: expected unsigned short [usertype] req_len drivers/bluetooth/btnxpuart.c:694:84: sparse: got restricted __le16 [usertype] len drivers/bluetooth/btnxpuart.c:708:23: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] requested_len @@ got restricted __le16 [usertype] len @@ drivers/bluetooth/btnxpuart.c:708:23: sparse: expected unsigned int [usertype] requested_len drivers/bluetooth/btnxpuart.c:708:23: sparse: got restricted __le16 [usertype] len drivers/bluetooth/btnxpuart.c:787:78: sparse: sparse: incorrect type in argument 2 (different base types) @@ expected unsigned short [usertype] chipid @@ got restricted __le16 [usertype] chip_id @@ drivers/bluetooth/btnxpuart.c:787:78: sparse: expected unsigned short [usertype] chipid drivers/bluetooth/btnxpuart.c:787:78: sparse: got restricted __le16 [usertype] chip_id drivers/bluetooth/btnxpuart.c:810:74: sparse: sparse: incorrect type in argument 2 (different base types) @@ expected unsigned short [usertype] req_len @@ got restricted __le16 [usertype] len @@ drivers/bluetooth/btnxpuart.c:810:74: sparse: expected unsigned short [usertype] req_len drivers/bluetooth/btnxpuart.c:810:74: sparse: got restricted __le16 [usertype] len drivers/bluetooth/btnxpuart.c:815:76: sparse: sparse: incorrect type in argument 2 (different base types) @@ expected unsigned short [usertype] req_len @@ got restricted __le16 [usertype] len @@ drivers/bluetooth/btnxpuart.c:815:76: sparse: expected unsigned short [usertype] req_len drivers/bluetooth/btnxpuart.c:815:76: sparse: got restricted __le16 [usertype] len drivers/bluetooth/btnxpuart.c:834:16: sparse: sparse: restricted __le32 degrades to integer drivers/bluetooth/btnxpuart.c:843:55: sparse: sparse: restricted __le32 degrades to integer drivers/bluetooth/btnxpuart.c:844:36: sparse: sparse: incorrect type in argument 3 (different base types) @@ expected unsigned long [usertype] @@ got restricted __le16 [usertype] len @@ drivers/bluetooth/btnxpuart.c:844:36: sparse: expected unsigned long [usertype] drivers/bluetooth/btnxpuart.c:844:36: sparse: got restricted __le16 [usertype] len Reported-by: kernel test robot <[email protected]> Link: https://lore.kernel.org/oe-kbuild-all/[email protected]/ Signed-off-by: Luiz Augusto von Dentz <[email protected]>
1 parent 9a24ce5 commit 9e080b5

File tree

1 file changed

+51
-34
lines changed

1 file changed

+51
-34
lines changed

drivers/bluetooth/btnxpuart.c

Lines changed: 51 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -683,12 +683,14 @@ static int nxp_recv_chip_ver_v1(struct hci_dev *hdev, struct sk_buff *skb)
683683
{
684684
struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev);
685685
struct v1_start_ind *req;
686+
__u16 chip_id;
686687

687-
req = (struct v1_start_ind *)skb_pull_data(skb, sizeof(struct v1_start_ind));
688+
req = skb_pull_data(skb, sizeof(*req));
688689
if (!req)
689690
goto free_skb;
690691

691-
if ((req->chip_id ^ req->chip_id_comp) == 0xffff) {
692+
chip_id = le16_to_cpu(req->chip_id ^ req->chip_id_comp);
693+
if (chip_id == 0xffff) {
692694
nxpdev->fw_dnld_v1_offset = 0;
693695
nxpdev->fw_v1_sent_bytes = 0;
694696
nxpdev->fw_v1_expected_len = HDR_LEN;
@@ -707,29 +709,34 @@ static int nxp_recv_fw_req_v1(struct hci_dev *hdev, struct sk_buff *skb)
707709
struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev);
708710
struct btnxpuart_data *nxp_data = nxpdev->nxp_data;
709711
struct v1_data_req *req;
710-
u32 requested_len;
712+
__u16 len;
711713

712714
if (!process_boot_signature(nxpdev))
713715
goto free_skb;
714716

715-
req = (struct v1_data_req *)skb_pull_data(skb, sizeof(struct v1_data_req));
717+
req = skb_pull_data(skb, sizeof(*req));
716718
if (!req)
717719
goto free_skb;
718720

719-
if ((req->len ^ req->len_comp) != 0xffff) {
721+
len = __le16_to_cpu(req->len ^ req->len_comp);
722+
if (len != 0xffff) {
720723
bt_dev_dbg(hdev, "ERR: Send NAK");
721724
nxp_send_ack(NXP_NAK_V1, hdev);
722725
goto free_skb;
723726
}
724727
nxp_send_ack(NXP_ACK_V1, hdev);
725728

729+
len = __le16_to_cpu(req->len);
730+
726731
if (!nxp_data->helper_fw_name) {
727732
if (!nxpdev->timeout_changed) {
728-
nxpdev->timeout_changed = nxp_fw_change_timeout(hdev, req->len);
733+
nxpdev->timeout_changed = nxp_fw_change_timeout(hdev,
734+
len);
729735
goto free_skb;
730736
}
731737
if (!nxpdev->baudrate_changed) {
732-
nxpdev->baudrate_changed = nxp_fw_change_baudrate(hdev, req->len);
738+
nxpdev->baudrate_changed = nxp_fw_change_baudrate(hdev,
739+
len);
733740
if (nxpdev->baudrate_changed) {
734741
serdev_device_set_baudrate(nxpdev->serdev,
735742
HCI_NXP_SEC_BAUDRATE);
@@ -748,26 +755,27 @@ static int nxp_recv_fw_req_v1(struct hci_dev *hdev, struct sk_buff *skb)
748755
goto free_skb;
749756
}
750757

751-
requested_len = req->len;
752-
if (requested_len == 0) {
753-
bt_dev_dbg(hdev, "FW Downloaded Successfully: %zu bytes", nxpdev->fw->size);
758+
if (!len) {
759+
bt_dev_dbg(hdev, "FW Downloaded Successfully: %zu bytes",
760+
nxpdev->fw->size);
754761
if (nxp_data->helper_fw_name && !nxpdev->helper_downloaded) {
755762
nxpdev->helper_downloaded = true;
756763
serdev_device_wait_until_sent(nxpdev->serdev, 0);
757-
serdev_device_set_baudrate(nxpdev->serdev, HCI_NXP_SEC_BAUDRATE);
764+
serdev_device_set_baudrate(nxpdev->serdev,
765+
HCI_NXP_SEC_BAUDRATE);
758766
serdev_device_set_flow_control(nxpdev->serdev, 1);
759767
} else {
760768
clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state);
761769
wake_up_interruptible(&nxpdev->fw_dnld_done_wait_q);
762770
}
763771
goto free_skb;
764772
}
765-
if (requested_len & 0x01) {
773+
if (len & 0x01) {
766774
/* The CRC did not match at the other end.
767775
* Simply send the same bytes again.
768776
*/
769-
requested_len = nxpdev->fw_v1_sent_bytes;
770-
bt_dev_dbg(hdev, "CRC error. Resend %d bytes of FW.", requested_len);
777+
len = nxpdev->fw_v1_sent_bytes;
778+
bt_dev_dbg(hdev, "CRC error. Resend %d bytes of FW.", len);
771779
} else {
772780
nxpdev->fw_dnld_v1_offset += nxpdev->fw_v1_sent_bytes;
773781

@@ -781,24 +789,23 @@ static int nxp_recv_fw_req_v1(struct hci_dev *hdev, struct sk_buff *skb)
781789
* mismatch, clearly the driver and FW are out of sync,
782790
* and we need to re-send the previous header again.
783791
*/
784-
if (requested_len == nxpdev->fw_v1_expected_len) {
785-
if (requested_len == HDR_LEN)
792+
if (len == nxpdev->fw_v1_expected_len) {
793+
if (len == HDR_LEN)
786794
nxpdev->fw_v1_expected_len = nxp_get_data_len(nxpdev->fw->data +
787795
nxpdev->fw_dnld_v1_offset);
788796
else
789797
nxpdev->fw_v1_expected_len = HDR_LEN;
790-
} else if (requested_len == HDR_LEN) {
798+
} else if (len == HDR_LEN) {
791799
/* FW download out of sync. Send previous chunk again */
792800
nxpdev->fw_dnld_v1_offset -= nxpdev->fw_v1_sent_bytes;
793801
nxpdev->fw_v1_expected_len = HDR_LEN;
794802
}
795803
}
796804

797-
if (nxpdev->fw_dnld_v1_offset + requested_len <= nxpdev->fw->size)
798-
serdev_device_write_buf(nxpdev->serdev,
799-
nxpdev->fw->data + nxpdev->fw_dnld_v1_offset,
800-
requested_len);
801-
nxpdev->fw_v1_sent_bytes = requested_len;
805+
if (nxpdev->fw_dnld_v1_offset + len <= nxpdev->fw->size)
806+
serdev_device_write_buf(nxpdev->serdev, nxpdev->fw->data +
807+
nxpdev->fw_dnld_v1_offset, len);
808+
nxpdev->fw_v1_sent_bytes = len;
802809

803810
free_skb:
804811
kfree_skb(skb);
@@ -828,13 +835,16 @@ static char *nxp_get_fw_name_from_chipid(struct hci_dev *hdev, u16 chipid)
828835

829836
static int nxp_recv_chip_ver_v3(struct hci_dev *hdev, struct sk_buff *skb)
830837
{
831-
struct v3_start_ind *req = skb_pull_data(skb, sizeof(struct v3_start_ind));
838+
struct v3_start_ind *req = skb_pull_data(skb, sizeof(*req));
832839
struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev);
840+
u16 chip_id;
833841

834842
if (!process_boot_signature(nxpdev))
835843
goto free_skb;
836844

837-
if (!nxp_request_firmware(hdev, nxp_get_fw_name_from_chipid(hdev, req->chip_id)))
845+
chip_id = le16_to_cpu(req->chip_id);
846+
if (!nxp_request_firmware(hdev, nxp_get_fw_name_from_chipid(hdev,
847+
chip_id)))
838848
nxp_send_ack(NXP_ACK_V3, hdev);
839849

840850
free_skb:
@@ -846,23 +856,27 @@ static int nxp_recv_fw_req_v3(struct hci_dev *hdev, struct sk_buff *skb)
846856
{
847857
struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev);
848858
struct v3_data_req *req;
859+
__u16 len;
860+
__u32 offset;
849861

850862
if (!process_boot_signature(nxpdev))
851863
goto free_skb;
852864

853-
req = (struct v3_data_req *)skb_pull_data(skb, sizeof(struct v3_data_req));
865+
req = skb_pull_data(skb, sizeof(*req));
854866
if (!req || !nxpdev->fw)
855867
goto free_skb;
856868

857869
nxp_send_ack(NXP_ACK_V3, hdev);
858870

871+
len = __le16_to_cpu(req->len);
872+
859873
if (!nxpdev->timeout_changed) {
860-
nxpdev->timeout_changed = nxp_fw_change_timeout(hdev, req->len);
874+
nxpdev->timeout_changed = nxp_fw_change_timeout(hdev, len);
861875
goto free_skb;
862876
}
863877

864878
if (!nxpdev->baudrate_changed) {
865-
nxpdev->baudrate_changed = nxp_fw_change_baudrate(hdev, req->len);
879+
nxpdev->baudrate_changed = nxp_fw_change_baudrate(hdev, len);
866880
if (nxpdev->baudrate_changed) {
867881
serdev_device_set_baudrate(nxpdev->serdev,
868882
HCI_NXP_SEC_BAUDRATE);
@@ -873,25 +887,28 @@ static int nxp_recv_fw_req_v3(struct hci_dev *hdev, struct sk_buff *skb)
873887
}
874888

875889
if (req->len == 0) {
876-
bt_dev_dbg(hdev, "FW Downloaded Successfully: %zu bytes", nxpdev->fw->size);
890+
bt_dev_dbg(hdev, "FW Downloaded Successfully: %zu bytes",
891+
nxpdev->fw->size);
877892
clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state);
878893
wake_up_interruptible(&nxpdev->fw_dnld_done_wait_q);
879894
goto free_skb;
880895
}
881896
if (req->error)
882-
bt_dev_dbg(hdev, "FW Download received err 0x%02x from chip", req->error);
897+
bt_dev_dbg(hdev, "FW Download received err 0x%02x from chip",
898+
req->error);
883899

884-
if (req->offset < nxpdev->fw_v3_offset_correction) {
900+
offset = __le32_to_cpu(req->offset);
901+
if (offset < nxpdev->fw_v3_offset_correction) {
885902
/* This scenario should ideally never occur. But if it ever does,
886903
* FW is out of sync and needs a power cycle.
887904
*/
888-
bt_dev_err(hdev, "Something went wrong during FW download. Please power cycle and try again");
905+
bt_dev_err(hdev, "Something went wrong during FW download");
906+
bt_dev_err(hdev, "Please power cycle and try again");
889907
goto free_skb;
890908
}
891909

892-
serdev_device_write_buf(nxpdev->serdev,
893-
nxpdev->fw->data + req->offset - nxpdev->fw_v3_offset_correction,
894-
req->len);
910+
serdev_device_write_buf(nxpdev->serdev, nxpdev->fw->data + offset -
911+
nxpdev->fw_v3_offset_correction, len);
895912

896913
free_skb:
897914
kfree_skb(skb);

0 commit comments

Comments
 (0)