1 // SPDX-License-Identifier: GPL-2.0-only
3 #include <linux/module.h>
4 #include <linux/virtio.h>
5 #include <linux/virtio_config.h>
6 #include <linux/skbuff.h>
8 #include <uapi/linux/virtio_ids.h>
9 #include <uapi/linux/virtio_bt.h>
11 #include <net/bluetooth/bluetooth.h>
12 #include <net/bluetooth/hci_core.h>
22 struct virtio_bluetooth
{
23 struct virtio_device
*vdev
;
24 struct virtqueue
*vqs
[VIRTBT_NUM_VQS
];
25 struct work_struct rx
;
29 static int virtbt_add_inbuf(struct virtio_bluetooth
*vbt
)
31 struct virtqueue
*vq
= vbt
->vqs
[VIRTBT_VQ_RX
];
32 struct scatterlist sg
[1];
36 skb
= alloc_skb(1000, GFP_KERNEL
);
40 sg_init_one(sg
, skb
->data
, 1000);
42 err
= virtqueue_add_inbuf(vq
, sg
, 1, skb
, GFP_KERNEL
);
51 static int virtbt_open(struct hci_dev
*hdev
)
56 static int virtbt_open_vdev(struct virtio_bluetooth
*vbt
)
58 if (virtbt_add_inbuf(vbt
) < 0)
61 virtqueue_kick(vbt
->vqs
[VIRTBT_VQ_RX
]);
65 static int virtbt_close(struct hci_dev
*hdev
)
70 static int virtbt_close_vdev(struct virtio_bluetooth
*vbt
)
74 cancel_work_sync(&vbt
->rx
);
76 for (i
= 0; i
< ARRAY_SIZE(vbt
->vqs
); i
++) {
77 struct virtqueue
*vq
= vbt
->vqs
[i
];
80 while ((skb
= virtqueue_detach_unused_buf(vq
)))
88 static int virtbt_flush(struct hci_dev
*hdev
)
93 static int virtbt_send_frame(struct hci_dev
*hdev
, struct sk_buff
*skb
)
95 struct virtio_bluetooth
*vbt
= hci_get_drvdata(hdev
);
96 struct scatterlist sg
[1];
99 memcpy(skb_push(skb
, 1), &hci_skb_pkt_type(skb
), 1);
101 sg_init_one(sg
, skb
->data
, skb
->len
);
102 err
= virtqueue_add_outbuf(vbt
->vqs
[VIRTBT_VQ_TX
], sg
, 1, skb
,
109 virtqueue_kick(vbt
->vqs
[VIRTBT_VQ_TX
]);
113 static int virtbt_setup_zephyr(struct hci_dev
*hdev
)
117 /* Read Build Information */
118 skb
= __hci_cmd_sync(hdev
, 0xfc08, 0, NULL
, HCI_INIT_TIMEOUT
);
122 bt_dev_info(hdev
, "%s", (char *)(skb
->data
+ 1));
124 hci_set_fw_info(hdev
, "%s", skb
->data
+ 1);
130 static int virtbt_set_bdaddr_zephyr(struct hci_dev
*hdev
,
131 const bdaddr_t
*bdaddr
)
136 skb
= __hci_cmd_sync(hdev
, 0xfc06, 6, bdaddr
, HCI_INIT_TIMEOUT
);
144 static int virtbt_setup_intel(struct hci_dev
*hdev
)
148 /* Intel Read Version */
149 skb
= __hci_cmd_sync(hdev
, 0xfc05, 0, NULL
, HCI_CMD_TIMEOUT
);
157 static int virtbt_set_bdaddr_intel(struct hci_dev
*hdev
, const bdaddr_t
*bdaddr
)
161 /* Intel Write BD Address */
162 skb
= __hci_cmd_sync(hdev
, 0xfc31, 6, bdaddr
, HCI_INIT_TIMEOUT
);
170 static int virtbt_setup_realtek(struct hci_dev
*hdev
)
174 /* Read ROM Version */
175 skb
= __hci_cmd_sync(hdev
, 0xfc6d, 0, NULL
, HCI_INIT_TIMEOUT
);
179 bt_dev_info(hdev
, "ROM version %u", *((__u8
*) (skb
->data
+ 1)));
185 static int virtbt_shutdown_generic(struct hci_dev
*hdev
)
190 skb
= __hci_cmd_sync(hdev
, HCI_OP_RESET
, 0, NULL
, HCI_INIT_TIMEOUT
);
198 static void virtbt_rx_handle(struct virtio_bluetooth
*vbt
, struct sk_buff
*skb
)
202 pkt_type
= *((__u8
*) skb
->data
);
207 case HCI_ACLDATA_PKT
:
208 case HCI_SCODATA_PKT
:
209 case HCI_ISODATA_PKT
:
210 hci_skb_pkt_type(skb
) = pkt_type
;
211 hci_recv_frame(vbt
->hdev
, skb
);
219 static void virtbt_rx_work(struct work_struct
*work
)
221 struct virtio_bluetooth
*vbt
= container_of(work
,
222 struct virtio_bluetooth
, rx
);
226 skb
= virtqueue_get_buf(vbt
->vqs
[VIRTBT_VQ_RX
], &len
);
231 virtbt_rx_handle(vbt
, skb
);
233 if (virtbt_add_inbuf(vbt
) < 0)
236 virtqueue_kick(vbt
->vqs
[VIRTBT_VQ_RX
]);
239 static void virtbt_tx_done(struct virtqueue
*vq
)
244 while ((skb
= virtqueue_get_buf(vq
, &len
)))
248 static void virtbt_rx_done(struct virtqueue
*vq
)
250 struct virtio_bluetooth
*vbt
= vq
->vdev
->priv
;
252 schedule_work(&vbt
->rx
);
255 static int virtbt_probe(struct virtio_device
*vdev
)
257 struct virtqueue_info vqs_info
[VIRTBT_NUM_VQS
] = {
258 [VIRTBT_VQ_TX
] = { "tx", virtbt_tx_done
},
259 [VIRTBT_VQ_RX
] = { "rx", virtbt_rx_done
},
261 struct virtio_bluetooth
*vbt
;
262 struct hci_dev
*hdev
;
266 if (!virtio_has_feature(vdev
, VIRTIO_F_VERSION_1
))
269 type
= virtio_cread8(vdev
, offsetof(struct virtio_bt_config
, type
));
272 case VIRTIO_BT_CONFIG_TYPE_PRIMARY
:
278 vbt
= kzalloc(sizeof(*vbt
), GFP_KERNEL
);
285 INIT_WORK(&vbt
->rx
, virtbt_rx_work
);
287 err
= virtio_find_vqs(vdev
, VIRTBT_NUM_VQS
, vbt
->vqs
, vqs_info
, NULL
);
291 hdev
= hci_alloc_dev();
299 hdev
->bus
= HCI_VIRTIO
;
300 hci_set_drvdata(hdev
, vbt
);
302 hdev
->open
= virtbt_open
;
303 hdev
->close
= virtbt_close
;
304 hdev
->flush
= virtbt_flush
;
305 hdev
->send
= virtbt_send_frame
;
307 if (virtio_has_feature(vdev
, VIRTIO_BT_F_VND_HCI
)) {
310 if (virtio_has_feature(vdev
, VIRTIO_BT_F_CONFIG_V2
))
311 virtio_cread(vdev
, struct virtio_bt_config_v2
,
314 virtio_cread(vdev
, struct virtio_bt_config
,
318 case VIRTIO_BT_CONFIG_VENDOR_ZEPHYR
:
319 hdev
->manufacturer
= 1521;
320 hdev
->setup
= virtbt_setup_zephyr
;
321 hdev
->shutdown
= virtbt_shutdown_generic
;
322 hdev
->set_bdaddr
= virtbt_set_bdaddr_zephyr
;
325 case VIRTIO_BT_CONFIG_VENDOR_INTEL
:
326 hdev
->manufacturer
= 2;
327 hdev
->setup
= virtbt_setup_intel
;
328 hdev
->shutdown
= virtbt_shutdown_generic
;
329 hdev
->set_bdaddr
= virtbt_set_bdaddr_intel
;
330 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER
, &hdev
->quirks
);
331 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY
, &hdev
->quirks
);
332 set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED
, &hdev
->quirks
);
335 case VIRTIO_BT_CONFIG_VENDOR_REALTEK
:
336 hdev
->manufacturer
= 93;
337 hdev
->setup
= virtbt_setup_realtek
;
338 hdev
->shutdown
= virtbt_shutdown_generic
;
339 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY
, &hdev
->quirks
);
340 set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED
, &hdev
->quirks
);
345 if (virtio_has_feature(vdev
, VIRTIO_BT_F_MSFT_EXT
)) {
348 if (virtio_has_feature(vdev
, VIRTIO_BT_F_CONFIG_V2
))
349 virtio_cread(vdev
, struct virtio_bt_config_v2
,
350 msft_opcode
, &msft_opcode
);
352 virtio_cread(vdev
, struct virtio_bt_config
,
353 msft_opcode
, &msft_opcode
);
355 hci_set_msft_opcode(hdev
, msft_opcode
);
358 if (virtio_has_feature(vdev
, VIRTIO_BT_F_AOSP_EXT
))
359 hci_set_aosp_capable(hdev
);
361 if (hci_register_dev(hdev
) < 0) {
367 virtio_device_ready(vdev
);
368 err
= virtbt_open_vdev(vbt
);
377 vdev
->config
->del_vqs(vdev
);
381 static void virtbt_remove(struct virtio_device
*vdev
)
383 struct virtio_bluetooth
*vbt
= vdev
->priv
;
384 struct hci_dev
*hdev
= vbt
->hdev
;
386 hci_unregister_dev(hdev
);
387 virtio_reset_device(vdev
);
388 virtbt_close_vdev(vbt
);
393 vdev
->config
->del_vqs(vdev
);
397 static struct virtio_device_id virtbt_table
[] = {
398 { VIRTIO_ID_BT
, VIRTIO_DEV_ANY_ID
},
402 MODULE_DEVICE_TABLE(virtio
, virtbt_table
);
404 static const unsigned int virtbt_features
[] = {
406 VIRTIO_BT_F_MSFT_EXT
,
407 VIRTIO_BT_F_AOSP_EXT
,
408 VIRTIO_BT_F_CONFIG_V2
,
411 static struct virtio_driver virtbt_driver
= {
412 .driver
.name
= KBUILD_MODNAME
,
413 .feature_table
= virtbt_features
,
414 .feature_table_size
= ARRAY_SIZE(virtbt_features
),
415 .id_table
= virtbt_table
,
416 .probe
= virtbt_probe
,
417 .remove
= virtbt_remove
,
420 module_virtio_driver(virtbt_driver
);
422 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
423 MODULE_DESCRIPTION("Generic Bluetooth VIRTIO driver ver " VERSION
);
424 MODULE_VERSION(VERSION
);
425 MODULE_LICENSE("GPL");