0001
0002
0003 #include <linux/module.h>
0004 #include <linux/virtio.h>
0005 #include <linux/virtio_config.h>
0006 #include <linux/skbuff.h>
0007
0008 #include <uapi/linux/virtio_ids.h>
0009 #include <uapi/linux/virtio_bt.h>
0010
0011 #include <net/bluetooth/bluetooth.h>
0012 #include <net/bluetooth/hci_core.h>
0013
0014 #define VERSION "0.1"
0015
0016 enum {
0017 VIRTBT_VQ_TX,
0018 VIRTBT_VQ_RX,
0019 VIRTBT_NUM_VQS,
0020 };
0021
0022 struct virtio_bluetooth {
0023 struct virtio_device *vdev;
0024 struct virtqueue *vqs[VIRTBT_NUM_VQS];
0025 struct work_struct rx;
0026 struct hci_dev *hdev;
0027 };
0028
0029 static int virtbt_add_inbuf(struct virtio_bluetooth *vbt)
0030 {
0031 struct virtqueue *vq = vbt->vqs[VIRTBT_VQ_RX];
0032 struct scatterlist sg[1];
0033 struct sk_buff *skb;
0034 int err;
0035
0036 skb = alloc_skb(1000, GFP_KERNEL);
0037 if (!skb)
0038 return -ENOMEM;
0039
0040 sg_init_one(sg, skb->data, 1000);
0041
0042 err = virtqueue_add_inbuf(vq, sg, 1, skb, GFP_KERNEL);
0043 if (err < 0) {
0044 kfree_skb(skb);
0045 return err;
0046 }
0047
0048 return 0;
0049 }
0050
0051 static int virtbt_open(struct hci_dev *hdev)
0052 {
0053 struct virtio_bluetooth *vbt = hci_get_drvdata(hdev);
0054
0055 if (virtbt_add_inbuf(vbt) < 0)
0056 return -EIO;
0057
0058 virtqueue_kick(vbt->vqs[VIRTBT_VQ_RX]);
0059 return 0;
0060 }
0061
0062 static int virtbt_close(struct hci_dev *hdev)
0063 {
0064 struct virtio_bluetooth *vbt = hci_get_drvdata(hdev);
0065 int i;
0066
0067 cancel_work_sync(&vbt->rx);
0068
0069 for (i = 0; i < ARRAY_SIZE(vbt->vqs); i++) {
0070 struct virtqueue *vq = vbt->vqs[i];
0071 struct sk_buff *skb;
0072
0073 while ((skb = virtqueue_detach_unused_buf(vq)))
0074 kfree_skb(skb);
0075 }
0076
0077 return 0;
0078 }
0079
0080 static int virtbt_flush(struct hci_dev *hdev)
0081 {
0082 return 0;
0083 }
0084
0085 static int virtbt_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
0086 {
0087 struct virtio_bluetooth *vbt = hci_get_drvdata(hdev);
0088 struct scatterlist sg[1];
0089 int err;
0090
0091 memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
0092
0093 sg_init_one(sg, skb->data, skb->len);
0094 err = virtqueue_add_outbuf(vbt->vqs[VIRTBT_VQ_TX], sg, 1, skb,
0095 GFP_KERNEL);
0096 if (err) {
0097 kfree_skb(skb);
0098 return err;
0099 }
0100
0101 virtqueue_kick(vbt->vqs[VIRTBT_VQ_TX]);
0102 return 0;
0103 }
0104
0105 static int virtbt_setup_zephyr(struct hci_dev *hdev)
0106 {
0107 struct sk_buff *skb;
0108
0109
0110 skb = __hci_cmd_sync(hdev, 0xfc08, 0, NULL, HCI_INIT_TIMEOUT);
0111 if (IS_ERR(skb))
0112 return PTR_ERR(skb);
0113
0114 bt_dev_info(hdev, "%s", (char *)(skb->data + 1));
0115
0116 hci_set_fw_info(hdev, "%s", skb->data + 1);
0117
0118 kfree_skb(skb);
0119 return 0;
0120 }
0121
0122 static int virtbt_set_bdaddr_zephyr(struct hci_dev *hdev,
0123 const bdaddr_t *bdaddr)
0124 {
0125 struct sk_buff *skb;
0126
0127
0128 skb = __hci_cmd_sync(hdev, 0xfc06, 6, bdaddr, HCI_INIT_TIMEOUT);
0129 if (IS_ERR(skb))
0130 return PTR_ERR(skb);
0131
0132 kfree_skb(skb);
0133 return 0;
0134 }
0135
0136 static int virtbt_setup_intel(struct hci_dev *hdev)
0137 {
0138 struct sk_buff *skb;
0139
0140
0141 skb = __hci_cmd_sync(hdev, 0xfc05, 0, NULL, HCI_CMD_TIMEOUT);
0142 if (IS_ERR(skb))
0143 return PTR_ERR(skb);
0144
0145 kfree_skb(skb);
0146 return 0;
0147 }
0148
0149 static int virtbt_set_bdaddr_intel(struct hci_dev *hdev, const bdaddr_t *bdaddr)
0150 {
0151 struct sk_buff *skb;
0152
0153
0154 skb = __hci_cmd_sync(hdev, 0xfc31, 6, bdaddr, HCI_INIT_TIMEOUT);
0155 if (IS_ERR(skb))
0156 return PTR_ERR(skb);
0157
0158 kfree_skb(skb);
0159 return 0;
0160 }
0161
0162 static int virtbt_setup_realtek(struct hci_dev *hdev)
0163 {
0164 struct sk_buff *skb;
0165
0166
0167 skb = __hci_cmd_sync(hdev, 0xfc6d, 0, NULL, HCI_INIT_TIMEOUT);
0168 if (IS_ERR(skb))
0169 return PTR_ERR(skb);
0170
0171 bt_dev_info(hdev, "ROM version %u", *((__u8 *) (skb->data + 1)));
0172
0173 kfree_skb(skb);
0174 return 0;
0175 }
0176
0177 static int virtbt_shutdown_generic(struct hci_dev *hdev)
0178 {
0179 struct sk_buff *skb;
0180
0181
0182 skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT);
0183 if (IS_ERR(skb))
0184 return PTR_ERR(skb);
0185
0186 kfree_skb(skb);
0187 return 0;
0188 }
0189
0190 static void virtbt_rx_handle(struct virtio_bluetooth *vbt, struct sk_buff *skb)
0191 {
0192 __u8 pkt_type;
0193
0194 pkt_type = *((__u8 *) skb->data);
0195 skb_pull(skb, 1);
0196
0197 switch (pkt_type) {
0198 case HCI_EVENT_PKT:
0199 case HCI_ACLDATA_PKT:
0200 case HCI_SCODATA_PKT:
0201 case HCI_ISODATA_PKT:
0202 hci_skb_pkt_type(skb) = pkt_type;
0203 hci_recv_frame(vbt->hdev, skb);
0204 break;
0205 default:
0206 kfree_skb(skb);
0207 break;
0208 }
0209 }
0210
0211 static void virtbt_rx_work(struct work_struct *work)
0212 {
0213 struct virtio_bluetooth *vbt = container_of(work,
0214 struct virtio_bluetooth, rx);
0215 struct sk_buff *skb;
0216 unsigned int len;
0217
0218 skb = virtqueue_get_buf(vbt->vqs[VIRTBT_VQ_RX], &len);
0219 if (!skb)
0220 return;
0221
0222 skb->len = len;
0223 virtbt_rx_handle(vbt, skb);
0224
0225 if (virtbt_add_inbuf(vbt) < 0)
0226 return;
0227
0228 virtqueue_kick(vbt->vqs[VIRTBT_VQ_RX]);
0229 }
0230
0231 static void virtbt_tx_done(struct virtqueue *vq)
0232 {
0233 struct sk_buff *skb;
0234 unsigned int len;
0235
0236 while ((skb = virtqueue_get_buf(vq, &len)))
0237 kfree_skb(skb);
0238 }
0239
0240 static void virtbt_rx_done(struct virtqueue *vq)
0241 {
0242 struct virtio_bluetooth *vbt = vq->vdev->priv;
0243
0244 schedule_work(&vbt->rx);
0245 }
0246
0247 static int virtbt_probe(struct virtio_device *vdev)
0248 {
0249 vq_callback_t *callbacks[VIRTBT_NUM_VQS] = {
0250 [VIRTBT_VQ_TX] = virtbt_tx_done,
0251 [VIRTBT_VQ_RX] = virtbt_rx_done,
0252 };
0253 const char *names[VIRTBT_NUM_VQS] = {
0254 [VIRTBT_VQ_TX] = "tx",
0255 [VIRTBT_VQ_RX] = "rx",
0256 };
0257 struct virtio_bluetooth *vbt;
0258 struct hci_dev *hdev;
0259 int err;
0260 __u8 type;
0261
0262 if (!virtio_has_feature(vdev, VIRTIO_F_VERSION_1))
0263 return -ENODEV;
0264
0265 type = virtio_cread8(vdev, offsetof(struct virtio_bt_config, type));
0266
0267 switch (type) {
0268 case VIRTIO_BT_CONFIG_TYPE_PRIMARY:
0269 case VIRTIO_BT_CONFIG_TYPE_AMP:
0270 break;
0271 default:
0272 return -EINVAL;
0273 }
0274
0275 vbt = kzalloc(sizeof(*vbt), GFP_KERNEL);
0276 if (!vbt)
0277 return -ENOMEM;
0278
0279 vdev->priv = vbt;
0280 vbt->vdev = vdev;
0281
0282 INIT_WORK(&vbt->rx, virtbt_rx_work);
0283
0284 err = virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, callbacks,
0285 names, NULL);
0286 if (err)
0287 return err;
0288
0289 hdev = hci_alloc_dev();
0290 if (!hdev) {
0291 err = -ENOMEM;
0292 goto failed;
0293 }
0294
0295 vbt->hdev = hdev;
0296
0297 hdev->bus = HCI_VIRTIO;
0298 hdev->dev_type = type;
0299 hci_set_drvdata(hdev, vbt);
0300
0301 hdev->open = virtbt_open;
0302 hdev->close = virtbt_close;
0303 hdev->flush = virtbt_flush;
0304 hdev->send = virtbt_send_frame;
0305
0306 if (virtio_has_feature(vdev, VIRTIO_BT_F_VND_HCI)) {
0307 __u16 vendor;
0308
0309 virtio_cread(vdev, struct virtio_bt_config, vendor, &vendor);
0310
0311 switch (vendor) {
0312 case VIRTIO_BT_CONFIG_VENDOR_ZEPHYR:
0313 hdev->manufacturer = 1521;
0314 hdev->setup = virtbt_setup_zephyr;
0315 hdev->shutdown = virtbt_shutdown_generic;
0316 hdev->set_bdaddr = virtbt_set_bdaddr_zephyr;
0317 break;
0318
0319 case VIRTIO_BT_CONFIG_VENDOR_INTEL:
0320 hdev->manufacturer = 2;
0321 hdev->setup = virtbt_setup_intel;
0322 hdev->shutdown = virtbt_shutdown_generic;
0323 hdev->set_bdaddr = virtbt_set_bdaddr_intel;
0324 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
0325 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
0326 set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
0327 break;
0328
0329 case VIRTIO_BT_CONFIG_VENDOR_REALTEK:
0330 hdev->manufacturer = 93;
0331 hdev->setup = virtbt_setup_realtek;
0332 hdev->shutdown = virtbt_shutdown_generic;
0333 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
0334 set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
0335 break;
0336 }
0337 }
0338
0339 if (virtio_has_feature(vdev, VIRTIO_BT_F_MSFT_EXT)) {
0340 __u16 msft_opcode;
0341
0342 virtio_cread(vdev, struct virtio_bt_config,
0343 msft_opcode, &msft_opcode);
0344
0345 hci_set_msft_opcode(hdev, msft_opcode);
0346 }
0347
0348 if (virtio_has_feature(vdev, VIRTIO_BT_F_AOSP_EXT))
0349 hci_set_aosp_capable(hdev);
0350
0351 if (hci_register_dev(hdev) < 0) {
0352 hci_free_dev(hdev);
0353 err = -EBUSY;
0354 goto failed;
0355 }
0356
0357 return 0;
0358
0359 failed:
0360 vdev->config->del_vqs(vdev);
0361 return err;
0362 }
0363
0364 static void virtbt_remove(struct virtio_device *vdev)
0365 {
0366 struct virtio_bluetooth *vbt = vdev->priv;
0367 struct hci_dev *hdev = vbt->hdev;
0368
0369 hci_unregister_dev(hdev);
0370 virtio_reset_device(vdev);
0371
0372 hci_free_dev(hdev);
0373 vbt->hdev = NULL;
0374
0375 vdev->config->del_vqs(vdev);
0376 kfree(vbt);
0377 }
0378
0379 static struct virtio_device_id virtbt_table[] = {
0380 { VIRTIO_ID_BT, VIRTIO_DEV_ANY_ID },
0381 { 0 },
0382 };
0383
0384 MODULE_DEVICE_TABLE(virtio, virtbt_table);
0385
0386 static const unsigned int virtbt_features[] = {
0387 VIRTIO_BT_F_VND_HCI,
0388 VIRTIO_BT_F_MSFT_EXT,
0389 VIRTIO_BT_F_AOSP_EXT,
0390 };
0391
0392 static struct virtio_driver virtbt_driver = {
0393 .driver.name = KBUILD_MODNAME,
0394 .driver.owner = THIS_MODULE,
0395 .feature_table = virtbt_features,
0396 .feature_table_size = ARRAY_SIZE(virtbt_features),
0397 .id_table = virtbt_table,
0398 .probe = virtbt_probe,
0399 .remove = virtbt_remove,
0400 };
0401
0402 module_virtio_driver(virtbt_driver);
0403
0404 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
0405 MODULE_DESCRIPTION("Generic Bluetooth VIRTIO driver ver " VERSION);
0406 MODULE_VERSION(VERSION);
0407 MODULE_LICENSE("GPL");