diff options
author | Sean Wang <sean.wang@mediatek.com> | 2019-02-14 18:19:36 -0500 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2019-02-18 08:07:38 -0500 |
commit | 88e5f366a1903bfb717ad37a72f4657dae4d81da (patch) | |
tree | 904f0e95a857cce109af774fc143fb179f870dd9 /drivers/bluetooth | |
parent | 77f328dbc6cf42f22c691a164958a5452142a542 (diff) |
Bluetooth: mediatek: pass a pointer to mtk_hci_wmt_sync
Pass a structure pointer to mtk_hci_wmt_sync rather than several arguments
to avoid take up additional stack area and be better to read the code.
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'drivers/bluetooth')
-rw-r--r-- | drivers/bluetooth/btmtkuart.c | 63 |
1 files changed, 48 insertions, 15 deletions
diff --git a/drivers/bluetooth/btmtkuart.c b/drivers/bluetooth/btmtkuart.c index 9f8177b216b6..4451b1db139a 100644 --- a/drivers/bluetooth/btmtkuart.c +++ b/drivers/bluetooth/btmtkuart.c | |||
@@ -58,6 +58,14 @@ struct mtk_hci_wmt_cmd { | |||
58 | u8 data[256]; | 58 | u8 data[256]; |
59 | } __packed; | 59 | } __packed; |
60 | 60 | ||
61 | struct btmtk_hci_wmt_params { | ||
62 | u8 op; | ||
63 | u8 flag; | ||
64 | u16 dlen; | ||
65 | const void *data; | ||
66 | u32 *status; | ||
67 | }; | ||
68 | |||
61 | struct btmtkuart_dev { | 69 | struct btmtkuart_dev { |
62 | struct hci_dev *hdev; | 70 | struct hci_dev *hdev; |
63 | struct serdev_device *serdev; | 71 | struct serdev_device *serdev; |
@@ -74,8 +82,8 @@ struct btmtkuart_dev { | |||
74 | u16 stp_dlen; | 82 | u16 stp_dlen; |
75 | }; | 83 | }; |
76 | 84 | ||
77 | static int mtk_hci_wmt_sync(struct hci_dev *hdev, u8 op, u8 flag, u16 plen, | 85 | static int mtk_hci_wmt_sync(struct hci_dev *hdev, |
78 | const void *param) | 86 | struct btmtk_hci_wmt_params *wmt_params) |
79 | { | 87 | { |
80 | struct btmtkuart_dev *bdev = hci_get_drvdata(hdev); | 88 | struct btmtkuart_dev *bdev = hci_get_drvdata(hdev); |
81 | struct mtk_hci_wmt_cmd wc; | 89 | struct mtk_hci_wmt_cmd wc; |
@@ -83,16 +91,16 @@ static int mtk_hci_wmt_sync(struct hci_dev *hdev, u8 op, u8 flag, u16 plen, | |||
83 | u32 hlen; | 91 | u32 hlen; |
84 | int err; | 92 | int err; |
85 | 93 | ||
86 | hlen = sizeof(*hdr) + plen; | 94 | hlen = sizeof(*hdr) + wmt_params->dlen; |
87 | if (hlen > 255) | 95 | if (hlen > 255) |
88 | return -EINVAL; | 96 | return -EINVAL; |
89 | 97 | ||
90 | hdr = (struct mtk_wmt_hdr *)&wc; | 98 | hdr = (struct mtk_wmt_hdr *)&wc; |
91 | hdr->dir = 1; | 99 | hdr->dir = 1; |
92 | hdr->op = op; | 100 | hdr->op = wmt_params->op; |
93 | hdr->dlen = cpu_to_le16(plen + 1); | 101 | hdr->dlen = cpu_to_le16(wmt_params->dlen + 1); |
94 | hdr->flag = flag; | 102 | hdr->flag = wmt_params->flag; |
95 | memcpy(wc.data, param, plen); | 103 | memcpy(wc.data, wmt_params->data, wmt_params->dlen); |
96 | 104 | ||
97 | set_bit(BTMTKUART_TX_WAIT_VND_EVT, &bdev->tx_state); | 105 | set_bit(BTMTKUART_TX_WAIT_VND_EVT, &bdev->tx_state); |
98 | 106 | ||
@@ -130,6 +138,7 @@ static int mtk_hci_wmt_sync(struct hci_dev *hdev, u8 op, u8 flag, u16 plen, | |||
130 | 138 | ||
131 | static int mtk_setup_fw(struct hci_dev *hdev) | 139 | static int mtk_setup_fw(struct hci_dev *hdev) |
132 | { | 140 | { |
141 | struct btmtk_hci_wmt_params wmt_params; | ||
133 | const struct firmware *fw; | 142 | const struct firmware *fw; |
134 | const u8 *fw_ptr; | 143 | const u8 *fw_ptr; |
135 | size_t fw_size; | 144 | size_t fw_size; |
@@ -155,6 +164,9 @@ static int mtk_setup_fw(struct hci_dev *hdev) | |||
155 | fw_ptr += 30; | 164 | fw_ptr += 30; |
156 | flag = 1; | 165 | flag = 1; |
157 | 166 | ||
167 | wmt_params.op = MTK_WMT_PATCH_DWNLD; | ||
168 | wmt_params.status = NULL; | ||
169 | |||
158 | while (fw_size > 0) { | 170 | while (fw_size > 0) { |
159 | dlen = min_t(int, 250, fw_size); | 171 | dlen = min_t(int, 250, fw_size); |
160 | 172 | ||
@@ -164,8 +176,11 @@ static int mtk_setup_fw(struct hci_dev *hdev) | |||
164 | else if (fw_size < fw->size - 30) | 176 | else if (fw_size < fw->size - 30) |
165 | flag = 2; | 177 | flag = 2; |
166 | 178 | ||
167 | err = mtk_hci_wmt_sync(hdev, MTK_WMT_PATCH_DWNLD, flag, dlen, | 179 | wmt_params.flag = flag; |
168 | fw_ptr); | 180 | wmt_params.dlen = dlen; |
181 | wmt_params.data = fw_ptr; | ||
182 | |||
183 | err = mtk_hci_wmt_sync(hdev, &wmt_params); | ||
169 | if (err < 0) { | 184 | if (err < 0) { |
170 | bt_dev_err(hdev, "Failed to send wmt patch dwnld (%d)", | 185 | bt_dev_err(hdev, "Failed to send wmt patch dwnld (%d)", |
171 | err); | 186 | err); |
@@ -469,6 +484,7 @@ static int btmtkuart_flush(struct hci_dev *hdev) | |||
469 | 484 | ||
470 | static int btmtkuart_setup(struct hci_dev *hdev) | 485 | static int btmtkuart_setup(struct hci_dev *hdev) |
471 | { | 486 | { |
487 | struct btmtk_hci_wmt_params wmt_params; | ||
472 | u8 param = 0x1; | 488 | u8 param = 0x1; |
473 | int err = 0; | 489 | int err = 0; |
474 | 490 | ||
@@ -477,16 +493,27 @@ static int btmtkuart_setup(struct hci_dev *hdev) | |||
477 | if (err < 0) | 493 | if (err < 0) |
478 | return err; | 494 | return err; |
479 | 495 | ||
480 | /* Activate function the firmware providing to */ | 496 | wmt_params.op = MTK_WMT_RST; |
481 | err = mtk_hci_wmt_sync(hdev, MTK_WMT_RST, 0x4, 0, 0); | 497 | wmt_params.flag = 4; |
498 | wmt_params.dlen = 0; | ||
499 | wmt_params.data = NULL; | ||
500 | wmt_params.status = NULL; | ||
501 | |||
502 | /* Activate funciton the firmware providing to */ | ||
503 | err = mtk_hci_wmt_sync(hdev, &wmt_params); | ||
482 | if (err < 0) { | 504 | if (err < 0) { |
483 | bt_dev_err(hdev, "Failed to send wmt rst (%d)", err); | 505 | bt_dev_err(hdev, "Failed to send wmt rst (%d)", err); |
484 | return err; | 506 | return err; |
485 | } | 507 | } |
486 | 508 | ||
487 | /* Enable Bluetooth protocol */ | 509 | /* Enable Bluetooth protocol */ |
488 | err = mtk_hci_wmt_sync(hdev, MTK_WMT_FUNC_CTRL, 0x0, sizeof(param), | 510 | wmt_params.op = MTK_WMT_FUNC_CTRL; |
489 | ¶m); | 511 | wmt_params.flag = 0; |
512 | wmt_params.dlen = sizeof(param); | ||
513 | wmt_params.data = ¶m; | ||
514 | wmt_params.status = NULL; | ||
515 | |||
516 | err = mtk_hci_wmt_sync(hdev, &wmt_params); | ||
490 | if (err < 0) { | 517 | if (err < 0) { |
491 | bt_dev_err(hdev, "Failed to send wmt func ctrl (%d)", err); | 518 | bt_dev_err(hdev, "Failed to send wmt func ctrl (%d)", err); |
492 | return err; | 519 | return err; |
@@ -497,12 +524,18 @@ static int btmtkuart_setup(struct hci_dev *hdev) | |||
497 | 524 | ||
498 | static int btmtkuart_shutdown(struct hci_dev *hdev) | 525 | static int btmtkuart_shutdown(struct hci_dev *hdev) |
499 | { | 526 | { |
527 | struct btmtk_hci_wmt_params wmt_params; | ||
500 | u8 param = 0x0; | 528 | u8 param = 0x0; |
501 | int err; | 529 | int err; |
502 | 530 | ||
503 | /* Disable the device */ | 531 | /* Disable the device */ |
504 | err = mtk_hci_wmt_sync(hdev, MTK_WMT_FUNC_CTRL, 0x0, sizeof(param), | 532 | wmt_params.op = MTK_WMT_FUNC_CTRL; |
505 | ¶m); | 533 | wmt_params.flag = 0; |
534 | wmt_params.dlen = sizeof(param); | ||
535 | wmt_params.data = ¶m; | ||
536 | wmt_params.status = NULL; | ||
537 | |||
538 | err = mtk_hci_wmt_sync(hdev, &wmt_params); | ||
506 | if (err < 0) { | 539 | if (err < 0) { |
507 | bt_dev_err(hdev, "Failed to send wmt func ctrl (%d)", err); | 540 | bt_dev_err(hdev, "Failed to send wmt func ctrl (%d)", err); |
508 | return err; | 541 | return err; |