summaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth
diff options
context:
space:
mode:
authorSean Wang <sean.wang@mediatek.com>2019-02-14 18:19:36 -0500
committerMarcel Holtmann <marcel@holtmann.org>2019-02-18 08:07:38 -0500
commit88e5f366a1903bfb717ad37a72f4657dae4d81da (patch)
tree904f0e95a857cce109af774fc143fb179f870dd9 /drivers/bluetooth
parent77f328dbc6cf42f22c691a164958a5452142a542 (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.c63
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
61struct btmtk_hci_wmt_params {
62 u8 op;
63 u8 flag;
64 u16 dlen;
65 const void *data;
66 u32 *status;
67};
68
61struct btmtkuart_dev { 69struct 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
77static int mtk_hci_wmt_sync(struct hci_dev *hdev, u8 op, u8 flag, u16 plen, 85static 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
131static int mtk_setup_fw(struct hci_dev *hdev) 139static 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
470static int btmtkuart_setup(struct hci_dev *hdev) 485static 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 &param); 511 wmt_params.flag = 0;
512 wmt_params.dlen = sizeof(param);
513 wmt_params.data = &param;
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
498static int btmtkuart_shutdown(struct hci_dev *hdev) 525static 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 &param); 533 wmt_params.flag = 0;
534 wmt_params.dlen = sizeof(param);
535 wmt_params.data = &param;
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;