Lines Matching refs:hdev
62 static void btmtk_coredump(struct hci_dev *hdev) in btmtk_coredump() argument
66 err = __hci_cmd_send(hdev, 0xfd5b, 0, NULL); in btmtk_coredump()
68 bt_dev_err(hdev, "Coredump failed (%d)", err); in btmtk_coredump()
71 static void btmtk_coredump_hdr(struct hci_dev *hdev, struct sk_buff *skb) in btmtk_coredump_hdr() argument
73 struct btmtk_data *data = hci_get_priv(hdev); in btmtk_coredump_hdr()
92 static void btmtk_coredump_notify(struct hci_dev *hdev, int state) in btmtk_coredump_notify() argument
94 struct btmtk_data *data = hci_get_priv(hdev); in btmtk_coredump_notify()
107 btmtk_reset_sync(hdev); in btmtk_coredump_notify()
130 int btmtk_setup_firmware_79xx(struct hci_dev *hdev, const char *fwname, in btmtk_setup_firmware_79xx() argument
145 err = request_firmware(&fw, fwname, &hdev->dev); in btmtk_setup_firmware_79xx()
147 bt_dev_err(hdev, "Failed to load firmware file (%d)", err); in btmtk_setup_firmware_79xx()
157 bt_dev_info(hdev, "HW/SW Version: 0x%04x%04x, Build Time: %s", in btmtk_setup_firmware_79xx()
186 err = wmt_cmd_sync(hdev, &wmt_params); in btmtk_setup_firmware_79xx()
188 bt_dev_err(hdev, "Failed to send wmt patch dwnld (%d)", in btmtk_setup_firmware_79xx()
201 bt_dev_err(hdev, "Failed wmt patch dwnld status (%d)", in btmtk_setup_firmware_79xx()
227 err = wmt_cmd_sync(hdev, &wmt_params); in btmtk_setup_firmware_79xx()
229 bt_dev_err(hdev, "Failed to send wmt patch dwnld (%d)", in btmtk_setup_firmware_79xx()
251 int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname, in btmtk_setup_firmware() argument
261 err = request_firmware(&fw, fwname, &hdev->dev); in btmtk_setup_firmware()
263 bt_dev_err(hdev, "Failed to load firmware file (%d)", err); in btmtk_setup_firmware()
275 err = wmt_cmd_sync(hdev, &wmt_params); in btmtk_setup_firmware()
277 bt_dev_err(hdev, "Failed to power on data RAM (%d)", err); in btmtk_setup_firmware()
310 err = wmt_cmd_sync(hdev, &wmt_params); in btmtk_setup_firmware()
312 bt_dev_err(hdev, "Failed to send wmt patch dwnld (%d)", in btmtk_setup_firmware()
328 err = wmt_cmd_sync(hdev, &wmt_params); in btmtk_setup_firmware()
330 bt_dev_err(hdev, "Failed to send wmt rst (%d)", err); in btmtk_setup_firmware()
344 int btmtk_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr) in btmtk_set_bdaddr() argument
349 skb = __hci_cmd_sync(hdev, 0xfc1a, 6, bdaddr, HCI_INIT_TIMEOUT); in btmtk_set_bdaddr()
352 bt_dev_err(hdev, "changing Mediatek device address failed (%ld)", in btmtk_set_bdaddr()
362 void btmtk_reset_sync(struct hci_dev *hdev) in btmtk_reset_sync() argument
364 struct btmtk_data *reset_work = hci_get_priv(hdev); in btmtk_reset_sync()
367 hci_dev_lock(hdev); in btmtk_reset_sync()
369 err = hci_cmd_sync_queue(hdev, reset_work->reset_sync, NULL, NULL); in btmtk_reset_sync()
371 bt_dev_err(hdev, "failed to reset (%d)", err); in btmtk_reset_sync()
373 hci_dev_unlock(hdev); in btmtk_reset_sync()
377 int btmtk_register_coredump(struct hci_dev *hdev, const char *name, in btmtk_register_coredump() argument
380 struct btmtk_data *data = hci_get_priv(hdev); in btmtk_register_coredump()
389 return hci_devcd_register(hdev, btmtk_coredump, btmtk_coredump_hdr, in btmtk_register_coredump()
394 int btmtk_process_coredump(struct hci_dev *hdev, struct sk_buff *skb) in btmtk_process_coredump() argument
396 struct btmtk_data *data = hci_get_priv(hdev); in btmtk_process_coredump()
407 err = hci_devcd_init(hdev, MTK_COREDUMP_SIZE); in btmtk_process_coredump()
415 schedule_delayed_work(&hdev->dump.dump_timeout, in btmtk_process_coredump()
427 err = hci_devcd_append(hdev, skb); in btmtk_process_coredump()
433 bt_dev_info(hdev, "Mediatek coredump end"); in btmtk_process_coredump()
434 hci_devcd_complete(hdev); in btmtk_process_coredump()
447 struct hci_dev *hdev = urb->context; in btmtk_usb_wmt_recv() local
448 struct btmtk_data *data = hci_get_priv(hdev); in btmtk_usb_wmt_recv()
453 hdev->stat.byte_rx += urb->actual_length; in btmtk_usb_wmt_recv()
460 hdev->stat.err_rx++; in btmtk_usb_wmt_recv()
480 err = hci_recv_frame(hdev, skb); in btmtk_usb_wmt_recv()
521 bt_dev_err(hdev, "urb %p failed to resubmit (%d)", in btmtk_usb_wmt_recv()
527 static int btmtk_usb_submit_wmt_recv_urb(struct hci_dev *hdev) in btmtk_usb_submit_wmt_recv_urb() argument
529 struct btmtk_data *data = hci_get_priv(hdev); in btmtk_usb_submit_wmt_recv_urb()
562 buf, size, btmtk_usb_wmt_recv, hdev); in btmtk_usb_submit_wmt_recv_urb()
570 bt_dev_err(hdev, "urb %p submission failed (%d)", in btmtk_usb_submit_wmt_recv_urb()
580 static int btmtk_usb_hci_wmt_sync(struct hci_dev *hdev, in btmtk_usb_hci_wmt_sync() argument
583 struct btmtk_data *data = hci_get_priv(hdev); in btmtk_usb_hci_wmt_sync()
619 err = __hci_cmd_send(hdev, 0xfc6f, hlen, wc); in btmtk_usb_hci_wmt_sync()
628 err = btmtk_usb_submit_wmt_recv_urb(hdev); in btmtk_usb_hci_wmt_sync()
648 bt_dev_err(hdev, "Execution of wmt command timed out"); in btmtk_usb_hci_wmt_sync()
660 bt_dev_err(hdev, "Wrong op received %d expected %d", in btmtk_usb_hci_wmt_sync()
703 static int btmtk_usb_func_query(struct hci_dev *hdev) in btmtk_usb_func_query() argument
716 err = btmtk_usb_hci_wmt_sync(hdev, &wmt_params); in btmtk_usb_func_query()
718 bt_dev_err(hdev, "Failed to query function status (%d)", err); in btmtk_usb_func_query()
725 static int btmtk_usb_uhw_reg_write(struct hci_dev *hdev, u32 reg, u32 val) in btmtk_usb_uhw_reg_write() argument
727 struct btmtk_data *data = hci_get_priv(hdev); in btmtk_usb_uhw_reg_write()
743 bt_dev_err(hdev, "Failed to write uhw reg(%d)", err); in btmtk_usb_uhw_reg_write()
750 static int btmtk_usb_uhw_reg_read(struct hci_dev *hdev, u32 reg, u32 *val) in btmtk_usb_uhw_reg_read() argument
752 struct btmtk_data *data = hci_get_priv(hdev); in btmtk_usb_uhw_reg_read()
766 bt_dev_err(hdev, "Failed to read uhw reg(%d)", err); in btmtk_usb_uhw_reg_read()
771 bt_dev_dbg(hdev, "reg=%x, value=0x%08x", reg, *val); in btmtk_usb_uhw_reg_read()
779 static int btmtk_usb_reg_read(struct hci_dev *hdev, u32 reg, u32 *val) in btmtk_usb_reg_read() argument
781 struct btmtk_data *data = hci_get_priv(hdev); in btmtk_usb_reg_read()
805 static int btmtk_usb_id_get(struct hci_dev *hdev, u32 reg, u32 *id) in btmtk_usb_id_get() argument
807 return btmtk_usb_reg_read(hdev, reg, id); in btmtk_usb_id_get()
810 static u32 btmtk_usb_reset_done(struct hci_dev *hdev) in btmtk_usb_reset_done() argument
814 btmtk_usb_uhw_reg_read(hdev, MTK_BT_MISC, &val); in btmtk_usb_reset_done()
819 int btmtk_usb_subsys_reset(struct hci_dev *hdev, u32 dev_id) in btmtk_usb_subsys_reset() argument
825 err = btmtk_usb_uhw_reg_read(hdev, MTK_BT_SUBSYS_RST, &val); in btmtk_usb_subsys_reset()
829 err = btmtk_usb_uhw_reg_write(hdev, MTK_BT_SUBSYS_RST, val); in btmtk_usb_subsys_reset()
832 err = btmtk_usb_uhw_reg_write(hdev, MTK_EP_RST_OPT, 0x00010001); in btmtk_usb_subsys_reset()
835 err = btmtk_usb_uhw_reg_read(hdev, MTK_BT_SUBSYS_RST, &val); in btmtk_usb_subsys_reset()
839 err = btmtk_usb_uhw_reg_write(hdev, MTK_BT_SUBSYS_RST, val); in btmtk_usb_subsys_reset()
844 err = btmtk_usb_uhw_reg_read(hdev, MTK_BT_RESET_REG_CONNV3, &val); in btmtk_usb_subsys_reset()
848 err = btmtk_usb_uhw_reg_write(hdev, MTK_BT_RESET_REG_CONNV3, val); in btmtk_usb_subsys_reset()
851 err = btmtk_usb_uhw_reg_read(hdev, MTK_BT_RESET_REG_CONNV3, &val); in btmtk_usb_subsys_reset()
856 err = btmtk_usb_uhw_reg_write(hdev, MTK_BT_RESET_REG_CONNV3, val); in btmtk_usb_subsys_reset()
859 err = btmtk_usb_uhw_reg_write(hdev, MTK_EP_RST_OPT, 0x00010001); in btmtk_usb_subsys_reset()
862 err = btmtk_usb_uhw_reg_read(hdev, MTK_BT_RESET_REG_CONNV3, &val); in btmtk_usb_subsys_reset()
866 err = btmtk_usb_uhw_reg_write(hdev, MTK_BT_RESET_REG_CONNV3, val); in btmtk_usb_subsys_reset()
869 err = btmtk_usb_uhw_reg_write(hdev, MTK_UDMA_INT_STA_BT, 0x000000FF); in btmtk_usb_subsys_reset()
872 err = btmtk_usb_uhw_reg_read(hdev, MTK_UDMA_INT_STA_BT, &val); in btmtk_usb_subsys_reset()
875 err = btmtk_usb_uhw_reg_write(hdev, MTK_UDMA_INT_STA_BT1, 0x000000FF); in btmtk_usb_subsys_reset()
878 err = btmtk_usb_uhw_reg_read(hdev, MTK_UDMA_INT_STA_BT1, &val); in btmtk_usb_subsys_reset()
884 bt_dev_dbg(hdev, "Initiating reset mechanism via uhw"); in btmtk_usb_subsys_reset()
885 err = btmtk_usb_uhw_reg_write(hdev, MTK_EP_RST_OPT, MTK_EP_RST_IN_OUT_OPT); in btmtk_usb_subsys_reset()
888 err = btmtk_usb_uhw_reg_read(hdev, MTK_BT_WDT_STATUS, &val); in btmtk_usb_subsys_reset()
892 err = btmtk_usb_uhw_reg_write(hdev, MTK_BT_SUBSYS_RST, 1); in btmtk_usb_subsys_reset()
895 err = btmtk_usb_uhw_reg_write(hdev, MTK_UDMA_INT_STA_BT, 0x000000FF); in btmtk_usb_subsys_reset()
898 err = btmtk_usb_uhw_reg_read(hdev, MTK_UDMA_INT_STA_BT, &val); in btmtk_usb_subsys_reset()
901 err = btmtk_usb_uhw_reg_write(hdev, MTK_UDMA_INT_STA_BT1, 0x000000FF); in btmtk_usb_subsys_reset()
904 err = btmtk_usb_uhw_reg_read(hdev, MTK_UDMA_INT_STA_BT1, &val); in btmtk_usb_subsys_reset()
909 err = btmtk_usb_uhw_reg_write(hdev, MTK_BT_SUBSYS_RST, 0); in btmtk_usb_subsys_reset()
912 err = btmtk_usb_uhw_reg_read(hdev, MTK_BT_SUBSYS_RST, &val); in btmtk_usb_subsys_reset()
917 err = readx_poll_timeout(btmtk_usb_reset_done, hdev, val, in btmtk_usb_subsys_reset()
920 bt_dev_err(hdev, "Reset timeout"); in btmtk_usb_subsys_reset()
923 err = btmtk_usb_uhw_reg_write(hdev, MTK_UDMA_INT_STA_BT, 0x000000FF); in btmtk_usb_subsys_reset()
928 err = btmtk_usb_id_get(hdev, 0x70010200, &val); in btmtk_usb_subsys_reset()
930 bt_dev_err(hdev, "Can't get device id, subsys reset fail."); in btmtk_usb_subsys_reset()
936 int btmtk_usb_recv_acl(struct hci_dev *hdev, struct sk_buff *skb) in btmtk_usb_recv_acl() argument
938 struct btmtk_data *data = hci_get_priv(hdev); in btmtk_usb_recv_acl()
956 btmtk_process_coredump(hdev, skb_cd); in btmtk_usb_recv_acl()
962 return hci_recv_diag(hdev, skb); in btmtk_usb_recv_acl()
965 return hci_recv_frame(hdev, skb); in btmtk_usb_recv_acl()
969 static int btmtk_isopkt_pad(struct hci_dev *hdev, struct sk_buff *skb) in btmtk_isopkt_pad() argument
982 static int __set_mtk_intr_interface(struct hci_dev *hdev) in __set_mtk_intr_interface() argument
984 struct btmtk_data *btmtk_data = hci_get_priv(hdev); in __set_mtk_intr_interface()
993 bt_dev_err(hdev, "setting interface failed (%d)", -err); in __set_mtk_intr_interface()
1020 bt_dev_err(hdev, "invalid interrupt descriptors"); in __set_mtk_intr_interface()
1027 struct urb *alloc_mtk_intr_urb(struct hci_dev *hdev, struct sk_buff *skb, in alloc_mtk_intr_urb() argument
1030 struct btmtk_data *btmtk_data = hci_get_priv(hdev); in alloc_mtk_intr_urb()
1041 if (btmtk_isopkt_pad(hdev, skb)) in alloc_mtk_intr_urb()
1051 skb->dev = (void *)hdev; in alloc_mtk_intr_urb()
1057 static int btmtk_recv_isopkt(struct hci_dev *hdev, void *buffer, int count) in btmtk_recv_isopkt() argument
1059 struct btmtk_data *btmtk_data = hci_get_priv(hdev); in btmtk_recv_isopkt()
1105 hci_recv_frame(hdev, skb); in btmtk_recv_isopkt()
1118 struct hci_dev *hdev = urb->context; in btmtk_intr_complete() local
1119 struct btmtk_data *btmtk_data = hci_get_priv(hdev); in btmtk_intr_complete()
1122 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btmtk_intr_complete()
1125 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btmtk_intr_complete()
1128 if (hdev->suspended) in btmtk_intr_complete()
1132 hdev->stat.byte_rx += urb->actual_length; in btmtk_intr_complete()
1134 if (btmtk_recv_isopkt(hdev, urb->transfer_buffer, in btmtk_intr_complete()
1136 bt_dev_err(hdev, "corrupted iso packet"); in btmtk_intr_complete()
1137 hdev->stat.err_rx++; in btmtk_intr_complete()
1153 bt_dev_err(hdev, "urb %p failed to resubmit (%d)", in btmtk_intr_complete()
1156 hci_cmd_sync_cancel(hdev, -err); in btmtk_intr_complete()
1161 static int btmtk_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags) in btmtk_submit_intr_urb() argument
1163 struct btmtk_data *btmtk_data = hci_get_priv(hdev); in btmtk_submit_intr_urb()
1169 BT_DBG("%s", hdev->name); in btmtk_submit_intr_urb()
1189 btmtk_intr_complete, hdev, in btmtk_submit_intr_urb()
1200 bt_dev_err(hdev, "urb %p submission failed (%d)", in btmtk_submit_intr_urb()
1210 static int btmtk_usb_isointf_init(struct hci_dev *hdev) in btmtk_usb_isointf_init() argument
1212 struct btmtk_data *btmtk_data = hci_get_priv(hdev); in btmtk_usb_isointf_init()
1219 __set_mtk_intr_interface(hdev); in btmtk_usb_isointf_init()
1221 err = btmtk_submit_intr_urb(hdev, GFP_KERNEL); in btmtk_usb_isointf_init()
1224 bt_dev_err(hdev, "ISO intf not support (%d)", err); in btmtk_usb_isointf_init()
1228 skb = __hci_cmd_sync(hdev, 0xfd98, sizeof(iso_param), iso_param, in btmtk_usb_isointf_init()
1231 bt_dev_err(hdev, "Failed to apply iso setting (%ld)", PTR_ERR(skb)); in btmtk_usb_isointf_init()
1239 int btmtk_usb_resume(struct hci_dev *hdev) in btmtk_usb_resume() argument
1244 struct btmtk_data *btmtk_data = hci_get_priv(hdev); in btmtk_usb_resume()
1248 if (btmtk_submit_intr_urb(hdev, GFP_NOIO) < 0) in btmtk_usb_resume()
1256 int btmtk_usb_suspend(struct hci_dev *hdev) in btmtk_usb_suspend() argument
1261 struct btmtk_data *btmtk_data = hci_get_priv(hdev); in btmtk_usb_suspend()
1271 int btmtk_usb_setup(struct hci_dev *hdev) in btmtk_usb_setup() argument
1273 struct btmtk_data *btmtk_data = hci_get_priv(hdev); in btmtk_usb_setup()
1288 err = btmtk_usb_id_get(hdev, 0x80000008, &dev_id); in btmtk_usb_setup()
1290 bt_dev_err(hdev, "Failed to get device id (%d)", err); in btmtk_usb_setup()
1295 err = btmtk_usb_id_get(hdev, 0x70010200, &dev_id); in btmtk_usb_setup()
1297 bt_dev_err(hdev, "Failed to get device id (%d)", err); in btmtk_usb_setup()
1300 err = btmtk_usb_id_get(hdev, 0x80021004, &fw_version); in btmtk_usb_setup()
1302 bt_dev_err(hdev, "Failed to get fw version (%d)", err); in btmtk_usb_setup()
1305 err = btmtk_usb_id_get(hdev, 0x70010020, &fw_flavor); in btmtk_usb_setup()
1307 bt_dev_err(hdev, "Failed to get fw flavor (%d)", err); in btmtk_usb_setup()
1315 err = btmtk_register_coredump(hdev, btmtk_data->drv_name, fw_version); in btmtk_usb_setup()
1317 bt_dev_err(hdev, "Failed to register coredump (%d)", err); in btmtk_usb_setup()
1332 err = btmtk_setup_firmware_79xx(hdev, fw_bin_name, in btmtk_usb_setup()
1335 bt_dev_err(hdev, "Failed to set up firmware (%d)", err); in btmtk_usb_setup()
1340 err = btmtk_usb_uhw_reg_write(hdev, MTK_EP_RST_OPT, in btmtk_usb_setup()
1353 err = btmtk_usb_hci_wmt_sync(hdev, &wmt_params); in btmtk_usb_setup()
1355 bt_dev_err(hdev, "Failed to send wmt func ctrl (%d)", err); in btmtk_usb_setup()
1359 hci_set_msft_opcode(hdev, 0xFD30); in btmtk_usb_setup()
1360 hci_set_aosp_capable(hdev); in btmtk_usb_setup()
1364 if (!btmtk_usb_isointf_init(hdev)) in btmtk_usb_setup()
1370 bt_dev_err(hdev, "Unsupported hardware variant (%08x)", in btmtk_usb_setup()
1382 err = btmtk_usb_hci_wmt_sync(hdev, &wmt_params); in btmtk_usb_setup()
1384 bt_dev_err(hdev, "Failed to query firmware status (%d)", err); in btmtk_usb_setup()
1389 bt_dev_info(hdev, "firmware already downloaded"); in btmtk_usb_setup()
1394 err = btmtk_setup_firmware(hdev, fwname, in btmtk_usb_setup()
1400 err = readx_poll_timeout(btmtk_usb_func_query, hdev, status, in btmtk_usb_setup()
1412 bt_dev_info(hdev, "function already on"); in btmtk_usb_setup()
1424 err = btmtk_usb_hci_wmt_sync(hdev, &wmt_params); in btmtk_usb_setup()
1426 bt_dev_err(hdev, "Failed to send wmt func ctrl (%d)", err); in btmtk_usb_setup()
1438 skb = __hci_cmd_sync(hdev, 0xfc7a, sizeof(tci_sleep), &tci_sleep, in btmtk_usb_setup()
1442 bt_dev_err(hdev, "Failed to apply low power setting (%d)", err); in btmtk_usb_setup()
1452 bt_dev_info(hdev, "Device setup in %llu usecs", duration); in btmtk_usb_setup()
1458 int btmtk_usb_shutdown(struct hci_dev *hdev) in btmtk_usb_shutdown() argument
1460 struct btmtk_data *data = hci_get_priv(hdev); in btmtk_usb_shutdown()
1476 err = btmtk_usb_hci_wmt_sync(hdev, &wmt_params); in btmtk_usb_shutdown()
1478 bt_dev_err(hdev, "Failed to send wmt func ctrl (%d)", err); in btmtk_usb_shutdown()