diff options
Diffstat (limited to 'drivers/bluetooth')
-rw-r--r-- | drivers/bluetooth/bfusb.c | 16 | ||||
-rw-r--r-- | drivers/bluetooth/bluecard_cs.c | 24 | ||||
-rw-r--r-- | drivers/bluetooth/bpa10x.c | 17 | ||||
-rw-r--r-- | drivers/bluetooth/bt3c_cs.c | 12 | ||||
-rw-r--r-- | drivers/bluetooth/btuart_cs.c | 10 | ||||
-rw-r--r-- | drivers/bluetooth/dtl1_cs.c | 10 | ||||
-rw-r--r-- | drivers/bluetooth/hci_bcsp.c | 18 | ||||
-rw-r--r-- | drivers/bluetooth/hci_h4.c | 4 | ||||
-rw-r--r-- | drivers/bluetooth/hci_ldisc.c | 4 | ||||
-rw-r--r-- | drivers/bluetooth/hci_usb.c | 23 | ||||
-rw-r--r-- | drivers/bluetooth/hci_vhci.c | 386 | ||||
-rw-r--r-- | drivers/bluetooth/hci_vhci.h | 50 |
12 files changed, 273 insertions, 301 deletions
diff --git a/drivers/bluetooth/bfusb.c b/drivers/bluetooth/bfusb.c index c42d7e6ac1c5..1e9db0156ea7 100644 --- a/drivers/bluetooth/bfusb.c +++ b/drivers/bluetooth/bfusb.c | |||
@@ -158,7 +158,7 @@ static int bfusb_send_bulk(struct bfusb *bfusb, struct sk_buff *skb) | |||
158 | if (err) { | 158 | if (err) { |
159 | BT_ERR("%s bulk tx submit failed urb %p err %d", | 159 | BT_ERR("%s bulk tx submit failed urb %p err %d", |
160 | bfusb->hdev->name, urb, err); | 160 | bfusb->hdev->name, urb, err); |
161 | skb_unlink(skb); | 161 | skb_unlink(skb, &bfusb->pending_q); |
162 | usb_free_urb(urb); | 162 | usb_free_urb(urb); |
163 | } else | 163 | } else |
164 | atomic_inc(&bfusb->pending_tx); | 164 | atomic_inc(&bfusb->pending_tx); |
@@ -212,7 +212,7 @@ static void bfusb_tx_complete(struct urb *urb, struct pt_regs *regs) | |||
212 | 212 | ||
213 | read_lock(&bfusb->lock); | 213 | read_lock(&bfusb->lock); |
214 | 214 | ||
215 | skb_unlink(skb); | 215 | skb_unlink(skb, &bfusb->pending_q); |
216 | skb_queue_tail(&bfusb->completed_q, skb); | 216 | skb_queue_tail(&bfusb->completed_q, skb); |
217 | 217 | ||
218 | bfusb_tx_wakeup(bfusb); | 218 | bfusb_tx_wakeup(bfusb); |
@@ -253,7 +253,7 @@ static int bfusb_rx_submit(struct bfusb *bfusb, struct urb *urb) | |||
253 | if (err) { | 253 | if (err) { |
254 | BT_ERR("%s bulk rx submit failed urb %p err %d", | 254 | BT_ERR("%s bulk rx submit failed urb %p err %d", |
255 | bfusb->hdev->name, urb, err); | 255 | bfusb->hdev->name, urb, err); |
256 | skb_unlink(skb); | 256 | skb_unlink(skb, &bfusb->pending_q); |
257 | kfree_skb(skb); | 257 | kfree_skb(skb); |
258 | usb_free_urb(urb); | 258 | usb_free_urb(urb); |
259 | } | 259 | } |
@@ -330,7 +330,7 @@ static inline int bfusb_recv_block(struct bfusb *bfusb, int hdr, unsigned char * | |||
330 | } | 330 | } |
331 | 331 | ||
332 | skb->dev = (void *) bfusb->hdev; | 332 | skb->dev = (void *) bfusb->hdev; |
333 | skb->pkt_type = pkt_type; | 333 | bt_cb(skb)->pkt_type = pkt_type; |
334 | 334 | ||
335 | bfusb->reassembly = skb; | 335 | bfusb->reassembly = skb; |
336 | } else { | 336 | } else { |
@@ -398,7 +398,7 @@ static void bfusb_rx_complete(struct urb *urb, struct pt_regs *regs) | |||
398 | buf += len; | 398 | buf += len; |
399 | } | 399 | } |
400 | 400 | ||
401 | skb_unlink(skb); | 401 | skb_unlink(skb, &bfusb->pending_q); |
402 | kfree_skb(skb); | 402 | kfree_skb(skb); |
403 | 403 | ||
404 | bfusb_rx_submit(bfusb, urb); | 404 | bfusb_rx_submit(bfusb, urb); |
@@ -485,7 +485,7 @@ static int bfusb_send_frame(struct sk_buff *skb) | |||
485 | unsigned char buf[3]; | 485 | unsigned char buf[3]; |
486 | int sent = 0, size, count; | 486 | int sent = 0, size, count; |
487 | 487 | ||
488 | BT_DBG("hdev %p skb %p type %d len %d", hdev, skb, skb->pkt_type, skb->len); | 488 | BT_DBG("hdev %p skb %p type %d len %d", hdev, skb, bt_cb(skb)->pkt_type, skb->len); |
489 | 489 | ||
490 | if (!hdev) { | 490 | if (!hdev) { |
491 | BT_ERR("Frame for unknown HCI device (hdev=NULL)"); | 491 | BT_ERR("Frame for unknown HCI device (hdev=NULL)"); |
@@ -497,7 +497,7 @@ static int bfusb_send_frame(struct sk_buff *skb) | |||
497 | 497 | ||
498 | bfusb = (struct bfusb *) hdev->driver_data; | 498 | bfusb = (struct bfusb *) hdev->driver_data; |
499 | 499 | ||
500 | switch (skb->pkt_type) { | 500 | switch (bt_cb(skb)->pkt_type) { |
501 | case HCI_COMMAND_PKT: | 501 | case HCI_COMMAND_PKT: |
502 | hdev->stat.cmd_tx++; | 502 | hdev->stat.cmd_tx++; |
503 | break; | 503 | break; |
@@ -510,7 +510,7 @@ static int bfusb_send_frame(struct sk_buff *skb) | |||
510 | }; | 510 | }; |
511 | 511 | ||
512 | /* Prepend skb with frame type */ | 512 | /* Prepend skb with frame type */ |
513 | memcpy(skb_push(skb, 1), &(skb->pkt_type), 1); | 513 | memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); |
514 | 514 | ||
515 | count = skb->len; | 515 | count = skb->len; |
516 | 516 | ||
diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c index bd2ec7e284cc..26fe9c0e1d20 100644 --- a/drivers/bluetooth/bluecard_cs.c +++ b/drivers/bluetooth/bluecard_cs.c | |||
@@ -270,7 +270,7 @@ static void bluecard_write_wakeup(bluecard_info_t *info) | |||
270 | if (!(skb = skb_dequeue(&(info->txq)))) | 270 | if (!(skb = skb_dequeue(&(info->txq)))) |
271 | break; | 271 | break; |
272 | 272 | ||
273 | if (skb->pkt_type & 0x80) { | 273 | if (bt_cb(skb)->pkt_type & 0x80) { |
274 | /* Disable RTS */ | 274 | /* Disable RTS */ |
275 | info->ctrl_reg |= REG_CONTROL_RTS; | 275 | info->ctrl_reg |= REG_CONTROL_RTS; |
276 | outb(info->ctrl_reg, iobase + REG_CONTROL); | 276 | outb(info->ctrl_reg, iobase + REG_CONTROL); |
@@ -288,13 +288,13 @@ static void bluecard_write_wakeup(bluecard_info_t *info) | |||
288 | /* Mark the buffer as dirty */ | 288 | /* Mark the buffer as dirty */ |
289 | clear_bit(ready_bit, &(info->tx_state)); | 289 | clear_bit(ready_bit, &(info->tx_state)); |
290 | 290 | ||
291 | if (skb->pkt_type & 0x80) { | 291 | if (bt_cb(skb)->pkt_type & 0x80) { |
292 | DECLARE_WAIT_QUEUE_HEAD(wq); | 292 | DECLARE_WAIT_QUEUE_HEAD(wq); |
293 | DEFINE_WAIT(wait); | 293 | DEFINE_WAIT(wait); |
294 | 294 | ||
295 | unsigned char baud_reg; | 295 | unsigned char baud_reg; |
296 | 296 | ||
297 | switch (skb->pkt_type) { | 297 | switch (bt_cb(skb)->pkt_type) { |
298 | case PKT_BAUD_RATE_460800: | 298 | case PKT_BAUD_RATE_460800: |
299 | baud_reg = REG_CONTROL_BAUD_RATE_460800; | 299 | baud_reg = REG_CONTROL_BAUD_RATE_460800; |
300 | break; | 300 | break; |
@@ -410,9 +410,9 @@ static void bluecard_receive(bluecard_info_t *info, unsigned int offset) | |||
410 | if (info->rx_state == RECV_WAIT_PACKET_TYPE) { | 410 | if (info->rx_state == RECV_WAIT_PACKET_TYPE) { |
411 | 411 | ||
412 | info->rx_skb->dev = (void *) info->hdev; | 412 | info->rx_skb->dev = (void *) info->hdev; |
413 | info->rx_skb->pkt_type = buf[i]; | 413 | bt_cb(info->rx_skb)->pkt_type = buf[i]; |
414 | 414 | ||
415 | switch (info->rx_skb->pkt_type) { | 415 | switch (bt_cb(info->rx_skb)->pkt_type) { |
416 | 416 | ||
417 | case 0x00: | 417 | case 0x00: |
418 | /* init packet */ | 418 | /* init packet */ |
@@ -444,7 +444,7 @@ static void bluecard_receive(bluecard_info_t *info, unsigned int offset) | |||
444 | 444 | ||
445 | default: | 445 | default: |
446 | /* unknown packet */ | 446 | /* unknown packet */ |
447 | BT_ERR("Unknown HCI packet with type 0x%02x received", info->rx_skb->pkt_type); | 447 | BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type); |
448 | info->hdev->stat.err_rx++; | 448 | info->hdev->stat.err_rx++; |
449 | 449 | ||
450 | kfree_skb(info->rx_skb); | 450 | kfree_skb(info->rx_skb); |
@@ -586,21 +586,21 @@ static int bluecard_hci_set_baud_rate(struct hci_dev *hdev, int baud) | |||
586 | switch (baud) { | 586 | switch (baud) { |
587 | case 460800: | 587 | case 460800: |
588 | cmd[4] = 0x00; | 588 | cmd[4] = 0x00; |
589 | skb->pkt_type = PKT_BAUD_RATE_460800; | 589 | bt_cb(skb)->pkt_type = PKT_BAUD_RATE_460800; |
590 | break; | 590 | break; |
591 | case 230400: | 591 | case 230400: |
592 | cmd[4] = 0x01; | 592 | cmd[4] = 0x01; |
593 | skb->pkt_type = PKT_BAUD_RATE_230400; | 593 | bt_cb(skb)->pkt_type = PKT_BAUD_RATE_230400; |
594 | break; | 594 | break; |
595 | case 115200: | 595 | case 115200: |
596 | cmd[4] = 0x02; | 596 | cmd[4] = 0x02; |
597 | skb->pkt_type = PKT_BAUD_RATE_115200; | 597 | bt_cb(skb)->pkt_type = PKT_BAUD_RATE_115200; |
598 | break; | 598 | break; |
599 | case 57600: | 599 | case 57600: |
600 | /* Fall through... */ | 600 | /* Fall through... */ |
601 | default: | 601 | default: |
602 | cmd[4] = 0x03; | 602 | cmd[4] = 0x03; |
603 | skb->pkt_type = PKT_BAUD_RATE_57600; | 603 | bt_cb(skb)->pkt_type = PKT_BAUD_RATE_57600; |
604 | break; | 604 | break; |
605 | } | 605 | } |
606 | 606 | ||
@@ -680,7 +680,7 @@ static int bluecard_hci_send_frame(struct sk_buff *skb) | |||
680 | 680 | ||
681 | info = (bluecard_info_t *)(hdev->driver_data); | 681 | info = (bluecard_info_t *)(hdev->driver_data); |
682 | 682 | ||
683 | switch (skb->pkt_type) { | 683 | switch (bt_cb(skb)->pkt_type) { |
684 | case HCI_COMMAND_PKT: | 684 | case HCI_COMMAND_PKT: |
685 | hdev->stat.cmd_tx++; | 685 | hdev->stat.cmd_tx++; |
686 | break; | 686 | break; |
@@ -693,7 +693,7 @@ static int bluecard_hci_send_frame(struct sk_buff *skb) | |||
693 | }; | 693 | }; |
694 | 694 | ||
695 | /* Prepend skb with frame type */ | 695 | /* Prepend skb with frame type */ |
696 | memcpy(skb_push(skb, 1), &(skb->pkt_type), 1); | 696 | memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); |
697 | skb_queue_tail(&(info->txq), skb); | 697 | skb_queue_tail(&(info->txq), skb); |
698 | 698 | ||
699 | bluecard_write_wakeup(info); | 699 | bluecard_write_wakeup(info); |
diff --git a/drivers/bluetooth/bpa10x.c b/drivers/bluetooth/bpa10x.c index f696da6f417b..a1bf8f066c88 100644 --- a/drivers/bluetooth/bpa10x.c +++ b/drivers/bluetooth/bpa10x.c | |||
@@ -105,7 +105,7 @@ static void bpa10x_recv_bulk(struct bpa10x_data *data, unsigned char *buf, int c | |||
105 | if (skb) { | 105 | if (skb) { |
106 | memcpy(skb_put(skb, len), buf, len); | 106 | memcpy(skb_put(skb, len), buf, len); |
107 | skb->dev = (void *) data->hdev; | 107 | skb->dev = (void *) data->hdev; |
108 | skb->pkt_type = HCI_ACLDATA_PKT; | 108 | bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; |
109 | hci_recv_frame(skb); | 109 | hci_recv_frame(skb); |
110 | } | 110 | } |
111 | break; | 111 | break; |
@@ -117,7 +117,7 @@ static void bpa10x_recv_bulk(struct bpa10x_data *data, unsigned char *buf, int c | |||
117 | if (skb) { | 117 | if (skb) { |
118 | memcpy(skb_put(skb, len), buf, len); | 118 | memcpy(skb_put(skb, len), buf, len); |
119 | skb->dev = (void *) data->hdev; | 119 | skb->dev = (void *) data->hdev; |
120 | skb->pkt_type = HCI_SCODATA_PKT; | 120 | bt_cb(skb)->pkt_type = HCI_SCODATA_PKT; |
121 | hci_recv_frame(skb); | 121 | hci_recv_frame(skb); |
122 | } | 122 | } |
123 | break; | 123 | break; |
@@ -129,7 +129,7 @@ static void bpa10x_recv_bulk(struct bpa10x_data *data, unsigned char *buf, int c | |||
129 | if (skb) { | 129 | if (skb) { |
130 | memcpy(skb_put(skb, len), buf, len); | 130 | memcpy(skb_put(skb, len), buf, len); |
131 | skb->dev = (void *) data->hdev; | 131 | skb->dev = (void *) data->hdev; |
132 | skb->pkt_type = HCI_VENDOR_PKT; | 132 | bt_cb(skb)->pkt_type = HCI_VENDOR_PKT; |
133 | hci_recv_frame(skb); | 133 | hci_recv_frame(skb); |
134 | } | 134 | } |
135 | break; | 135 | break; |
@@ -190,7 +190,7 @@ static int bpa10x_recv_event(struct bpa10x_data *data, unsigned char *buf, int s | |||
190 | } | 190 | } |
191 | 191 | ||
192 | skb->dev = (void *) data->hdev; | 192 | skb->dev = (void *) data->hdev; |
193 | skb->pkt_type = pkt_type; | 193 | bt_cb(skb)->pkt_type = pkt_type; |
194 | 194 | ||
195 | memcpy(skb_put(skb, size), buf, size); | 195 | memcpy(skb_put(skb, size), buf, size); |
196 | 196 | ||
@@ -307,7 +307,8 @@ unlock: | |||
307 | read_unlock(&data->lock); | 307 | read_unlock(&data->lock); |
308 | } | 308 | } |
309 | 309 | ||
310 | static inline struct urb *bpa10x_alloc_urb(struct usb_device *udev, unsigned int pipe, size_t size, int flags, void *data) | 310 | static inline struct urb *bpa10x_alloc_urb(struct usb_device *udev, unsigned int pipe, |
311 | size_t size, unsigned int __nocast flags, void *data) | ||
311 | { | 312 | { |
312 | struct urb *urb; | 313 | struct urb *urb; |
313 | struct usb_ctrlrequest *cr; | 314 | struct usb_ctrlrequest *cr; |
@@ -487,7 +488,7 @@ static int bpa10x_send_frame(struct sk_buff *skb) | |||
487 | struct hci_dev *hdev = (struct hci_dev *) skb->dev; | 488 | struct hci_dev *hdev = (struct hci_dev *) skb->dev; |
488 | struct bpa10x_data *data; | 489 | struct bpa10x_data *data; |
489 | 490 | ||
490 | BT_DBG("hdev %p skb %p type %d len %d", hdev, skb, skb->pkt_type, skb->len); | 491 | BT_DBG("hdev %p skb %p type %d len %d", hdev, skb, bt_cb(skb)->pkt_type, skb->len); |
491 | 492 | ||
492 | if (!hdev) { | 493 | if (!hdev) { |
493 | BT_ERR("Frame for unknown HCI device"); | 494 | BT_ERR("Frame for unknown HCI device"); |
@@ -500,9 +501,9 @@ static int bpa10x_send_frame(struct sk_buff *skb) | |||
500 | data = hdev->driver_data; | 501 | data = hdev->driver_data; |
501 | 502 | ||
502 | /* Prepend skb with frame type */ | 503 | /* Prepend skb with frame type */ |
503 | memcpy(skb_push(skb, 1), &(skb->pkt_type), 1); | 504 | memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); |
504 | 505 | ||
505 | switch (skb->pkt_type) { | 506 | switch (bt_cb(skb)->pkt_type) { |
506 | case HCI_COMMAND_PKT: | 507 | case HCI_COMMAND_PKT: |
507 | hdev->stat.cmd_tx++; | 508 | hdev->stat.cmd_tx++; |
508 | skb_queue_tail(&data->cmd_queue, skb); | 509 | skb_queue_tail(&data->cmd_queue, skb); |
diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c index adf1750ea58d..2e0338d80f32 100644 --- a/drivers/bluetooth/bt3c_cs.c +++ b/drivers/bluetooth/bt3c_cs.c | |||
@@ -259,11 +259,11 @@ static void bt3c_receive(bt3c_info_t *info) | |||
259 | if (info->rx_state == RECV_WAIT_PACKET_TYPE) { | 259 | if (info->rx_state == RECV_WAIT_PACKET_TYPE) { |
260 | 260 | ||
261 | info->rx_skb->dev = (void *) info->hdev; | 261 | info->rx_skb->dev = (void *) info->hdev; |
262 | info->rx_skb->pkt_type = inb(iobase + DATA_L); | 262 | bt_cb(info->rx_skb)->pkt_type = inb(iobase + DATA_L); |
263 | inb(iobase + DATA_H); | 263 | inb(iobase + DATA_H); |
264 | //printk("bt3c: PACKET_TYPE=%02x\n", info->rx_skb->pkt_type); | 264 | //printk("bt3c: PACKET_TYPE=%02x\n", bt_cb(info->rx_skb)->pkt_type); |
265 | 265 | ||
266 | switch (info->rx_skb->pkt_type) { | 266 | switch (bt_cb(info->rx_skb)->pkt_type) { |
267 | 267 | ||
268 | case HCI_EVENT_PKT: | 268 | case HCI_EVENT_PKT: |
269 | info->rx_state = RECV_WAIT_EVENT_HEADER; | 269 | info->rx_state = RECV_WAIT_EVENT_HEADER; |
@@ -282,7 +282,7 @@ static void bt3c_receive(bt3c_info_t *info) | |||
282 | 282 | ||
283 | default: | 283 | default: |
284 | /* Unknown packet */ | 284 | /* Unknown packet */ |
285 | BT_ERR("Unknown HCI packet with type 0x%02x received", info->rx_skb->pkt_type); | 285 | BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type); |
286 | info->hdev->stat.err_rx++; | 286 | info->hdev->stat.err_rx++; |
287 | clear_bit(HCI_RUNNING, &(info->hdev->flags)); | 287 | clear_bit(HCI_RUNNING, &(info->hdev->flags)); |
288 | 288 | ||
@@ -439,7 +439,7 @@ static int bt3c_hci_send_frame(struct sk_buff *skb) | |||
439 | 439 | ||
440 | info = (bt3c_info_t *) (hdev->driver_data); | 440 | info = (bt3c_info_t *) (hdev->driver_data); |
441 | 441 | ||
442 | switch (skb->pkt_type) { | 442 | switch (bt_cb(skb)->pkt_type) { |
443 | case HCI_COMMAND_PKT: | 443 | case HCI_COMMAND_PKT: |
444 | hdev->stat.cmd_tx++; | 444 | hdev->stat.cmd_tx++; |
445 | break; | 445 | break; |
@@ -452,7 +452,7 @@ static int bt3c_hci_send_frame(struct sk_buff *skb) | |||
452 | }; | 452 | }; |
453 | 453 | ||
454 | /* Prepend skb with frame type */ | 454 | /* Prepend skb with frame type */ |
455 | memcpy(skb_push(skb, 1), &(skb->pkt_type), 1); | 455 | memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); |
456 | skb_queue_tail(&(info->txq), skb); | 456 | skb_queue_tail(&(info->txq), skb); |
457 | 457 | ||
458 | spin_lock_irqsave(&(info->lock), flags); | 458 | spin_lock_irqsave(&(info->lock), flags); |
diff --git a/drivers/bluetooth/btuart_cs.c b/drivers/bluetooth/btuart_cs.c index e4c59fdc0e12..89486ea7a021 100644 --- a/drivers/bluetooth/btuart_cs.c +++ b/drivers/bluetooth/btuart_cs.c | |||
@@ -211,9 +211,9 @@ static void btuart_receive(btuart_info_t *info) | |||
211 | if (info->rx_state == RECV_WAIT_PACKET_TYPE) { | 211 | if (info->rx_state == RECV_WAIT_PACKET_TYPE) { |
212 | 212 | ||
213 | info->rx_skb->dev = (void *) info->hdev; | 213 | info->rx_skb->dev = (void *) info->hdev; |
214 | info->rx_skb->pkt_type = inb(iobase + UART_RX); | 214 | bt_cb(info->rx_skb)->pkt_type = inb(iobase + UART_RX); |
215 | 215 | ||
216 | switch (info->rx_skb->pkt_type) { | 216 | switch (bt_cb(info->rx_skb)->pkt_type) { |
217 | 217 | ||
218 | case HCI_EVENT_PKT: | 218 | case HCI_EVENT_PKT: |
219 | info->rx_state = RECV_WAIT_EVENT_HEADER; | 219 | info->rx_state = RECV_WAIT_EVENT_HEADER; |
@@ -232,7 +232,7 @@ static void btuart_receive(btuart_info_t *info) | |||
232 | 232 | ||
233 | default: | 233 | default: |
234 | /* Unknown packet */ | 234 | /* Unknown packet */ |
235 | BT_ERR("Unknown HCI packet with type 0x%02x received", info->rx_skb->pkt_type); | 235 | BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type); |
236 | info->hdev->stat.err_rx++; | 236 | info->hdev->stat.err_rx++; |
237 | clear_bit(HCI_RUNNING, &(info->hdev->flags)); | 237 | clear_bit(HCI_RUNNING, &(info->hdev->flags)); |
238 | 238 | ||
@@ -447,7 +447,7 @@ static int btuart_hci_send_frame(struct sk_buff *skb) | |||
447 | 447 | ||
448 | info = (btuart_info_t *)(hdev->driver_data); | 448 | info = (btuart_info_t *)(hdev->driver_data); |
449 | 449 | ||
450 | switch (skb->pkt_type) { | 450 | switch (bt_cb(skb)->pkt_type) { |
451 | case HCI_COMMAND_PKT: | 451 | case HCI_COMMAND_PKT: |
452 | hdev->stat.cmd_tx++; | 452 | hdev->stat.cmd_tx++; |
453 | break; | 453 | break; |
@@ -460,7 +460,7 @@ static int btuart_hci_send_frame(struct sk_buff *skb) | |||
460 | }; | 460 | }; |
461 | 461 | ||
462 | /* Prepend skb with frame type */ | 462 | /* Prepend skb with frame type */ |
463 | memcpy(skb_push(skb, 1), &(skb->pkt_type), 1); | 463 | memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); |
464 | skb_queue_tail(&(info->txq), skb); | 464 | skb_queue_tail(&(info->txq), skb); |
465 | 465 | ||
466 | btuart_write_wakeup(info); | 466 | btuart_write_wakeup(info); |
diff --git a/drivers/bluetooth/dtl1_cs.c b/drivers/bluetooth/dtl1_cs.c index e39868c3da48..84c1f8839422 100644 --- a/drivers/bluetooth/dtl1_cs.c +++ b/drivers/bluetooth/dtl1_cs.c | |||
@@ -251,7 +251,7 @@ static void dtl1_receive(dtl1_info_t *info) | |||
251 | info->rx_count = nsh->len + (nsh->len & 0x0001); | 251 | info->rx_count = nsh->len + (nsh->len & 0x0001); |
252 | break; | 252 | break; |
253 | case RECV_WAIT_DATA: | 253 | case RECV_WAIT_DATA: |
254 | info->rx_skb->pkt_type = nsh->type; | 254 | bt_cb(info->rx_skb)->pkt_type = nsh->type; |
255 | 255 | ||
256 | /* remove PAD byte if it exists */ | 256 | /* remove PAD byte if it exists */ |
257 | if (nsh->len & 0x0001) { | 257 | if (nsh->len & 0x0001) { |
@@ -262,7 +262,7 @@ static void dtl1_receive(dtl1_info_t *info) | |||
262 | /* remove NSH */ | 262 | /* remove NSH */ |
263 | skb_pull(info->rx_skb, NSHL); | 263 | skb_pull(info->rx_skb, NSHL); |
264 | 264 | ||
265 | switch (info->rx_skb->pkt_type) { | 265 | switch (bt_cb(info->rx_skb)->pkt_type) { |
266 | case 0x80: | 266 | case 0x80: |
267 | /* control data for the Nokia Card */ | 267 | /* control data for the Nokia Card */ |
268 | dtl1_control(info, info->rx_skb); | 268 | dtl1_control(info, info->rx_skb); |
@@ -272,12 +272,12 @@ static void dtl1_receive(dtl1_info_t *info) | |||
272 | case 0x84: | 272 | case 0x84: |
273 | /* send frame to the HCI layer */ | 273 | /* send frame to the HCI layer */ |
274 | info->rx_skb->dev = (void *) info->hdev; | 274 | info->rx_skb->dev = (void *) info->hdev; |
275 | info->rx_skb->pkt_type &= 0x0f; | 275 | bt_cb(info->rx_skb)->pkt_type &= 0x0f; |
276 | hci_recv_frame(info->rx_skb); | 276 | hci_recv_frame(info->rx_skb); |
277 | break; | 277 | break; |
278 | default: | 278 | default: |
279 | /* unknown packet */ | 279 | /* unknown packet */ |
280 | BT_ERR("Unknown HCI packet with type 0x%02x received", info->rx_skb->pkt_type); | 280 | BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type); |
281 | kfree_skb(info->rx_skb); | 281 | kfree_skb(info->rx_skb); |
282 | break; | 282 | break; |
283 | } | 283 | } |
@@ -410,7 +410,7 @@ static int dtl1_hci_send_frame(struct sk_buff *skb) | |||
410 | 410 | ||
411 | info = (dtl1_info_t *)(hdev->driver_data); | 411 | info = (dtl1_info_t *)(hdev->driver_data); |
412 | 412 | ||
413 | switch (skb->pkt_type) { | 413 | switch (bt_cb(skb)->pkt_type) { |
414 | case HCI_COMMAND_PKT: | 414 | case HCI_COMMAND_PKT: |
415 | hdev->stat.cmd_tx++; | 415 | hdev->stat.cmd_tx++; |
416 | nsh.type = 0x81; | 416 | nsh.type = 0x81; |
diff --git a/drivers/bluetooth/hci_bcsp.c b/drivers/bluetooth/hci_bcsp.c index 858fddb046de..0ee324e1265d 100644 --- a/drivers/bluetooth/hci_bcsp.c +++ b/drivers/bluetooth/hci_bcsp.c | |||
@@ -149,7 +149,7 @@ static int bcsp_enqueue(struct hci_uart *hu, struct sk_buff *skb) | |||
149 | return 0; | 149 | return 0; |
150 | } | 150 | } |
151 | 151 | ||
152 | switch (skb->pkt_type) { | 152 | switch (bt_cb(skb)->pkt_type) { |
153 | case HCI_ACLDATA_PKT: | 153 | case HCI_ACLDATA_PKT: |
154 | case HCI_COMMAND_PKT: | 154 | case HCI_COMMAND_PKT: |
155 | skb_queue_tail(&bcsp->rel, skb); | 155 | skb_queue_tail(&bcsp->rel, skb); |
@@ -227,7 +227,7 @@ static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data, | |||
227 | if (!nskb) | 227 | if (!nskb) |
228 | return NULL; | 228 | return NULL; |
229 | 229 | ||
230 | nskb->pkt_type = pkt_type; | 230 | bt_cb(nskb)->pkt_type = pkt_type; |
231 | 231 | ||
232 | bcsp_slip_msgdelim(nskb); | 232 | bcsp_slip_msgdelim(nskb); |
233 | 233 | ||
@@ -286,7 +286,7 @@ static struct sk_buff *bcsp_dequeue(struct hci_uart *hu) | |||
286 | since they have priority */ | 286 | since they have priority */ |
287 | 287 | ||
288 | if ((skb = skb_dequeue(&bcsp->unrel)) != NULL) { | 288 | if ((skb = skb_dequeue(&bcsp->unrel)) != NULL) { |
289 | struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, skb->pkt_type); | 289 | struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, bt_cb(skb)->pkt_type); |
290 | if (nskb) { | 290 | if (nskb) { |
291 | kfree_skb(skb); | 291 | kfree_skb(skb); |
292 | return nskb; | 292 | return nskb; |
@@ -303,7 +303,7 @@ static struct sk_buff *bcsp_dequeue(struct hci_uart *hu) | |||
303 | spin_lock_irqsave(&bcsp->unack.lock, flags); | 303 | spin_lock_irqsave(&bcsp->unack.lock, flags); |
304 | 304 | ||
305 | if (bcsp->unack.qlen < BCSP_TXWINSIZE && (skb = skb_dequeue(&bcsp->rel)) != NULL) { | 305 | if (bcsp->unack.qlen < BCSP_TXWINSIZE && (skb = skb_dequeue(&bcsp->rel)) != NULL) { |
306 | struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, skb->pkt_type); | 306 | struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, bt_cb(skb)->pkt_type); |
307 | if (nskb) { | 307 | if (nskb) { |
308 | __skb_queue_tail(&bcsp->unack, skb); | 308 | __skb_queue_tail(&bcsp->unack, skb); |
309 | mod_timer(&bcsp->tbcsp, jiffies + HZ / 4); | 309 | mod_timer(&bcsp->tbcsp, jiffies + HZ / 4); |
@@ -401,7 +401,7 @@ static void bcsp_handle_le_pkt(struct hci_uart *hu) | |||
401 | if (!nskb) | 401 | if (!nskb) |
402 | return; | 402 | return; |
403 | memcpy(skb_put(nskb, 4), conf_rsp_pkt, 4); | 403 | memcpy(skb_put(nskb, 4), conf_rsp_pkt, 4); |
404 | nskb->pkt_type = BCSP_LE_PKT; | 404 | bt_cb(nskb)->pkt_type = BCSP_LE_PKT; |
405 | 405 | ||
406 | skb_queue_head(&bcsp->unrel, nskb); | 406 | skb_queue_head(&bcsp->unrel, nskb); |
407 | hci_uart_tx_wakeup(hu); | 407 | hci_uart_tx_wakeup(hu); |
@@ -483,14 +483,14 @@ static inline void bcsp_complete_rx_pkt(struct hci_uart *hu) | |||
483 | bcsp_pkt_cull(bcsp); | 483 | bcsp_pkt_cull(bcsp); |
484 | if ((bcsp->rx_skb->data[1] & 0x0f) == 6 && | 484 | if ((bcsp->rx_skb->data[1] & 0x0f) == 6 && |
485 | bcsp->rx_skb->data[0] & 0x80) { | 485 | bcsp->rx_skb->data[0] & 0x80) { |
486 | bcsp->rx_skb->pkt_type = HCI_ACLDATA_PKT; | 486 | bt_cb(bcsp->rx_skb)->pkt_type = HCI_ACLDATA_PKT; |
487 | pass_up = 1; | 487 | pass_up = 1; |
488 | } else if ((bcsp->rx_skb->data[1] & 0x0f) == 5 && | 488 | } else if ((bcsp->rx_skb->data[1] & 0x0f) == 5 && |
489 | bcsp->rx_skb->data[0] & 0x80) { | 489 | bcsp->rx_skb->data[0] & 0x80) { |
490 | bcsp->rx_skb->pkt_type = HCI_EVENT_PKT; | 490 | bt_cb(bcsp->rx_skb)->pkt_type = HCI_EVENT_PKT; |
491 | pass_up = 1; | 491 | pass_up = 1; |
492 | } else if ((bcsp->rx_skb->data[1] & 0x0f) == 7) { | 492 | } else if ((bcsp->rx_skb->data[1] & 0x0f) == 7) { |
493 | bcsp->rx_skb->pkt_type = HCI_SCODATA_PKT; | 493 | bt_cb(bcsp->rx_skb)->pkt_type = HCI_SCODATA_PKT; |
494 | pass_up = 1; | 494 | pass_up = 1; |
495 | } else if ((bcsp->rx_skb->data[1] & 0x0f) == 1 && | 495 | } else if ((bcsp->rx_skb->data[1] & 0x0f) == 1 && |
496 | !(bcsp->rx_skb->data[0] & 0x80)) { | 496 | !(bcsp->rx_skb->data[0] & 0x80)) { |
@@ -512,7 +512,7 @@ static inline void bcsp_complete_rx_pkt(struct hci_uart *hu) | |||
512 | hdr.evt = 0xff; | 512 | hdr.evt = 0xff; |
513 | hdr.plen = bcsp->rx_skb->len; | 513 | hdr.plen = bcsp->rx_skb->len; |
514 | memcpy(skb_push(bcsp->rx_skb, HCI_EVENT_HDR_SIZE), &hdr, HCI_EVENT_HDR_SIZE); | 514 | memcpy(skb_push(bcsp->rx_skb, HCI_EVENT_HDR_SIZE), &hdr, HCI_EVENT_HDR_SIZE); |
515 | bcsp->rx_skb->pkt_type = HCI_EVENT_PKT; | 515 | bt_cb(bcsp->rx_skb)->pkt_type = HCI_EVENT_PKT; |
516 | 516 | ||
517 | hci_recv_frame(bcsp->rx_skb); | 517 | hci_recv_frame(bcsp->rx_skb); |
518 | } else { | 518 | } else { |
diff --git a/drivers/bluetooth/hci_h4.c b/drivers/bluetooth/hci_h4.c index 533323b60e63..cf8a22d58d96 100644 --- a/drivers/bluetooth/hci_h4.c +++ b/drivers/bluetooth/hci_h4.c | |||
@@ -112,7 +112,7 @@ static int h4_enqueue(struct hci_uart *hu, struct sk_buff *skb) | |||
112 | BT_DBG("hu %p skb %p", hu, skb); | 112 | BT_DBG("hu %p skb %p", hu, skb); |
113 | 113 | ||
114 | /* Prepend skb with frame type */ | 114 | /* Prepend skb with frame type */ |
115 | memcpy(skb_push(skb, 1), &skb->pkt_type, 1); | 115 | memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); |
116 | skb_queue_tail(&h4->txq, skb); | 116 | skb_queue_tail(&h4->txq, skb); |
117 | return 0; | 117 | return 0; |
118 | } | 118 | } |
@@ -239,7 +239,7 @@ static int h4_recv(struct hci_uart *hu, void *data, int count) | |||
239 | return 0; | 239 | return 0; |
240 | } | 240 | } |
241 | h4->rx_skb->dev = (void *) hu->hdev; | 241 | h4->rx_skb->dev = (void *) hu->hdev; |
242 | h4->rx_skb->pkt_type = type; | 242 | bt_cb(h4->rx_skb)->pkt_type = type; |
243 | } | 243 | } |
244 | return count; | 244 | return count; |
245 | } | 245 | } |
diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c index 90be2eae52e0..aed80cc22890 100644 --- a/drivers/bluetooth/hci_ldisc.c +++ b/drivers/bluetooth/hci_ldisc.c | |||
@@ -153,7 +153,7 @@ restart: | |||
153 | break; | 153 | break; |
154 | } | 154 | } |
155 | 155 | ||
156 | hci_uart_tx_complete(hu, skb->pkt_type); | 156 | hci_uart_tx_complete(hu, bt_cb(skb)->pkt_type); |
157 | kfree_skb(skb); | 157 | kfree_skb(skb); |
158 | } | 158 | } |
159 | 159 | ||
@@ -229,7 +229,7 @@ static int hci_uart_send_frame(struct sk_buff *skb) | |||
229 | hu = (struct hci_uart *) hdev->driver_data; | 229 | hu = (struct hci_uart *) hdev->driver_data; |
230 | tty = hu->tty; | 230 | tty = hu->tty; |
231 | 231 | ||
232 | BT_DBG("%s: type %d len %d", hdev->name, skb->pkt_type, skb->len); | 232 | BT_DBG("%s: type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len); |
233 | 233 | ||
234 | hu->proto->enqueue(hu, skb); | 234 | hu->proto->enqueue(hu, skb); |
235 | 235 | ||
diff --git a/drivers/bluetooth/hci_usb.c b/drivers/bluetooth/hci_usb.c index 657719b8254f..67d96b5cbb96 100644 --- a/drivers/bluetooth/hci_usb.c +++ b/drivers/bluetooth/hci_usb.c | |||
@@ -127,7 +127,7 @@ static struct usb_device_id blacklist_ids[] = { | |||
127 | { } /* Terminating entry */ | 127 | { } /* Terminating entry */ |
128 | }; | 128 | }; |
129 | 129 | ||
130 | static struct _urb *_urb_alloc(int isoc, int gfp) | 130 | static struct _urb *_urb_alloc(int isoc, unsigned int __nocast gfp) |
131 | { | 131 | { |
132 | struct _urb *_urb = kmalloc(sizeof(struct _urb) + | 132 | struct _urb *_urb = kmalloc(sizeof(struct _urb) + |
133 | sizeof(struct usb_iso_packet_descriptor) * isoc, gfp); | 133 | sizeof(struct usb_iso_packet_descriptor) * isoc, gfp); |
@@ -443,7 +443,7 @@ static int __tx_submit(struct hci_usb *husb, struct _urb *_urb) | |||
443 | 443 | ||
444 | static inline int hci_usb_send_ctrl(struct hci_usb *husb, struct sk_buff *skb) | 444 | static inline int hci_usb_send_ctrl(struct hci_usb *husb, struct sk_buff *skb) |
445 | { | 445 | { |
446 | struct _urb *_urb = __get_completed(husb, skb->pkt_type); | 446 | struct _urb *_urb = __get_completed(husb, bt_cb(skb)->pkt_type); |
447 | struct usb_ctrlrequest *dr; | 447 | struct usb_ctrlrequest *dr; |
448 | struct urb *urb; | 448 | struct urb *urb; |
449 | 449 | ||
@@ -451,7 +451,7 @@ static inline int hci_usb_send_ctrl(struct hci_usb *husb, struct sk_buff *skb) | |||
451 | _urb = _urb_alloc(0, GFP_ATOMIC); | 451 | _urb = _urb_alloc(0, GFP_ATOMIC); |
452 | if (!_urb) | 452 | if (!_urb) |
453 | return -ENOMEM; | 453 | return -ENOMEM; |
454 | _urb->type = skb->pkt_type; | 454 | _urb->type = bt_cb(skb)->pkt_type; |
455 | 455 | ||
456 | dr = kmalloc(sizeof(*dr), GFP_ATOMIC); | 456 | dr = kmalloc(sizeof(*dr), GFP_ATOMIC); |
457 | if (!dr) { | 457 | if (!dr) { |
@@ -479,7 +479,7 @@ static inline int hci_usb_send_ctrl(struct hci_usb *husb, struct sk_buff *skb) | |||
479 | 479 | ||
480 | static inline int hci_usb_send_bulk(struct hci_usb *husb, struct sk_buff *skb) | 480 | static inline int hci_usb_send_bulk(struct hci_usb *husb, struct sk_buff *skb) |
481 | { | 481 | { |
482 | struct _urb *_urb = __get_completed(husb, skb->pkt_type); | 482 | struct _urb *_urb = __get_completed(husb, bt_cb(skb)->pkt_type); |
483 | struct urb *urb; | 483 | struct urb *urb; |
484 | int pipe; | 484 | int pipe; |
485 | 485 | ||
@@ -487,7 +487,7 @@ static inline int hci_usb_send_bulk(struct hci_usb *husb, struct sk_buff *skb) | |||
487 | _urb = _urb_alloc(0, GFP_ATOMIC); | 487 | _urb = _urb_alloc(0, GFP_ATOMIC); |
488 | if (!_urb) | 488 | if (!_urb) |
489 | return -ENOMEM; | 489 | return -ENOMEM; |
490 | _urb->type = skb->pkt_type; | 490 | _urb->type = bt_cb(skb)->pkt_type; |
491 | } | 491 | } |
492 | 492 | ||
493 | urb = &_urb->urb; | 493 | urb = &_urb->urb; |
@@ -505,14 +505,14 @@ static inline int hci_usb_send_bulk(struct hci_usb *husb, struct sk_buff *skb) | |||
505 | #ifdef CONFIG_BT_HCIUSB_SCO | 505 | #ifdef CONFIG_BT_HCIUSB_SCO |
506 | static inline int hci_usb_send_isoc(struct hci_usb *husb, struct sk_buff *skb) | 506 | static inline int hci_usb_send_isoc(struct hci_usb *husb, struct sk_buff *skb) |
507 | { | 507 | { |
508 | struct _urb *_urb = __get_completed(husb, skb->pkt_type); | 508 | struct _urb *_urb = __get_completed(husb, bt_cb(skb)->pkt_type); |
509 | struct urb *urb; | 509 | struct urb *urb; |
510 | 510 | ||
511 | if (!_urb) { | 511 | if (!_urb) { |
512 | _urb = _urb_alloc(HCI_MAX_ISOC_FRAMES, GFP_ATOMIC); | 512 | _urb = _urb_alloc(HCI_MAX_ISOC_FRAMES, GFP_ATOMIC); |
513 | if (!_urb) | 513 | if (!_urb) |
514 | return -ENOMEM; | 514 | return -ENOMEM; |
515 | _urb->type = skb->pkt_type; | 515 | _urb->type = bt_cb(skb)->pkt_type; |
516 | } | 516 | } |
517 | 517 | ||
518 | BT_DBG("%s skb %p len %d", husb->hdev->name, skb, skb->len); | 518 | BT_DBG("%s skb %p len %d", husb->hdev->name, skb, skb->len); |
@@ -601,11 +601,11 @@ static int hci_usb_send_frame(struct sk_buff *skb) | |||
601 | if (!test_bit(HCI_RUNNING, &hdev->flags)) | 601 | if (!test_bit(HCI_RUNNING, &hdev->flags)) |
602 | return -EBUSY; | 602 | return -EBUSY; |
603 | 603 | ||
604 | BT_DBG("%s type %d len %d", hdev->name, skb->pkt_type, skb->len); | 604 | BT_DBG("%s type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len); |
605 | 605 | ||
606 | husb = (struct hci_usb *) hdev->driver_data; | 606 | husb = (struct hci_usb *) hdev->driver_data; |
607 | 607 | ||
608 | switch (skb->pkt_type) { | 608 | switch (bt_cb(skb)->pkt_type) { |
609 | case HCI_COMMAND_PKT: | 609 | case HCI_COMMAND_PKT: |
610 | hdev->stat.cmd_tx++; | 610 | hdev->stat.cmd_tx++; |
611 | break; | 611 | break; |
@@ -627,7 +627,7 @@ static int hci_usb_send_frame(struct sk_buff *skb) | |||
627 | 627 | ||
628 | read_lock(&husb->completion_lock); | 628 | read_lock(&husb->completion_lock); |
629 | 629 | ||
630 | skb_queue_tail(__transmit_q(husb, skb->pkt_type), skb); | 630 | skb_queue_tail(__transmit_q(husb, bt_cb(skb)->pkt_type), skb); |
631 | hci_usb_tx_wakeup(husb); | 631 | hci_usb_tx_wakeup(husb); |
632 | 632 | ||
633 | read_unlock(&husb->completion_lock); | 633 | read_unlock(&husb->completion_lock); |
@@ -682,7 +682,7 @@ static inline int __recv_frame(struct hci_usb *husb, int type, void *data, int c | |||
682 | return -ENOMEM; | 682 | return -ENOMEM; |
683 | } | 683 | } |
684 | skb->dev = (void *) husb->hdev; | 684 | skb->dev = (void *) husb->hdev; |
685 | skb->pkt_type = type; | 685 | bt_cb(skb)->pkt_type = type; |
686 | 686 | ||
687 | __reassembly(husb, type) = skb; | 687 | __reassembly(husb, type) = skb; |
688 | 688 | ||
@@ -702,6 +702,7 @@ static inline int __recv_frame(struct hci_usb *husb, int type, void *data, int c | |||
702 | if (!scb->expect) { | 702 | if (!scb->expect) { |
703 | /* Complete frame */ | 703 | /* Complete frame */ |
704 | __reassembly(husb, type) = NULL; | 704 | __reassembly(husb, type) = NULL; |
705 | bt_cb(skb)->pkt_type = type; | ||
705 | hci_recv_frame(skb); | 706 | hci_recv_frame(skb); |
706 | } | 707 | } |
707 | 708 | ||
diff --git a/drivers/bluetooth/hci_vhci.c b/drivers/bluetooth/hci_vhci.c index f9b956fb2b8b..52cbd45c308f 100644 --- a/drivers/bluetooth/hci_vhci.c +++ b/drivers/bluetooth/hci_vhci.c | |||
@@ -1,229 +1,220 @@ | |||
1 | /* | ||
2 | BlueZ - Bluetooth protocol stack for Linux | ||
3 | Copyright (C) 2000-2001 Qualcomm Incorporated | ||
4 | |||
5 | Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> | ||
6 | |||
7 | This program is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License version 2 as | ||
9 | published by the Free Software Foundation; | ||
10 | |||
11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | ||
12 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
13 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. | ||
14 | IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY | ||
15 | CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES | ||
16 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
17 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
18 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
19 | |||
20 | ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, | ||
21 | COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS | ||
22 | SOFTWARE IS DISCLAIMED. | ||
23 | */ | ||
24 | |||
25 | /* | 1 | /* |
26 | * Bluetooth HCI virtual device driver. | ||
27 | * | 2 | * |
28 | * $Id: hci_vhci.c,v 1.3 2002/04/17 17:37:20 maxk Exp $ | 3 | * Bluetooth virtual HCI driver |
4 | * | ||
5 | * Copyright (C) 2000-2001 Qualcomm Incorporated | ||
6 | * Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com> | ||
7 | * Copyright (C) 2004-2005 Marcel Holtmann <marcel@holtmann.org> | ||
8 | * | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | * | ||
15 | * This program is distributed in the hope that it will be useful, | ||
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
18 | * GNU General Public License for more details. | ||
19 | * | ||
20 | * You should have received a copy of the GNU General Public License | ||
21 | * along with this program; if not, write to the Free Software | ||
22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
23 | * | ||
29 | */ | 24 | */ |
30 | #define VERSION "1.1" | ||
31 | 25 | ||
32 | #include <linux/config.h> | 26 | #include <linux/config.h> |
33 | #include <linux/module.h> | 27 | #include <linux/module.h> |
34 | 28 | ||
35 | #include <linux/errno.h> | ||
36 | #include <linux/kernel.h> | 29 | #include <linux/kernel.h> |
37 | #include <linux/major.h> | 30 | #include <linux/init.h> |
38 | #include <linux/sched.h> | ||
39 | #include <linux/slab.h> | 31 | #include <linux/slab.h> |
32 | #include <linux/types.h> | ||
33 | #include <linux/errno.h> | ||
34 | #include <linux/sched.h> | ||
40 | #include <linux/poll.h> | 35 | #include <linux/poll.h> |
41 | #include <linux/fcntl.h> | ||
42 | #include <linux/init.h> | ||
43 | #include <linux/random.h> | ||
44 | 36 | ||
45 | #include <linux/skbuff.h> | 37 | #include <linux/skbuff.h> |
46 | #include <linux/miscdevice.h> | 38 | #include <linux/miscdevice.h> |
47 | 39 | ||
48 | #include <asm/system.h> | ||
49 | #include <asm/uaccess.h> | ||
50 | |||
51 | #include <net/bluetooth/bluetooth.h> | 40 | #include <net/bluetooth/bluetooth.h> |
52 | #include <net/bluetooth/hci_core.h> | 41 | #include <net/bluetooth/hci_core.h> |
53 | #include "hci_vhci.h" | ||
54 | 42 | ||
55 | /* HCI device part */ | 43 | #ifndef CONFIG_BT_HCIVHCI_DEBUG |
44 | #undef BT_DBG | ||
45 | #define BT_DBG(D...) | ||
46 | #endif | ||
47 | |||
48 | #define VERSION "1.2" | ||
49 | |||
50 | static int minor = MISC_DYNAMIC_MINOR; | ||
51 | |||
52 | struct vhci_data { | ||
53 | struct hci_dev *hdev; | ||
54 | |||
55 | unsigned long flags; | ||
56 | |||
57 | wait_queue_head_t read_wait; | ||
58 | struct sk_buff_head readq; | ||
59 | |||
60 | struct fasync_struct *fasync; | ||
61 | }; | ||
56 | 62 | ||
57 | static int hci_vhci_open(struct hci_dev *hdev) | 63 | #define VHCI_FASYNC 0x0010 |
64 | |||
65 | static struct miscdevice vhci_miscdev; | ||
66 | |||
67 | static int vhci_open_dev(struct hci_dev *hdev) | ||
58 | { | 68 | { |
59 | set_bit(HCI_RUNNING, &hdev->flags); | 69 | set_bit(HCI_RUNNING, &hdev->flags); |
60 | return 0; | ||
61 | } | ||
62 | 70 | ||
63 | static int hci_vhci_flush(struct hci_dev *hdev) | ||
64 | { | ||
65 | struct hci_vhci_struct *hci_vhci = (struct hci_vhci_struct *) hdev->driver_data; | ||
66 | skb_queue_purge(&hci_vhci->readq); | ||
67 | return 0; | 71 | return 0; |
68 | } | 72 | } |
69 | 73 | ||
70 | static int hci_vhci_close(struct hci_dev *hdev) | 74 | static int vhci_close_dev(struct hci_dev *hdev) |
71 | { | 75 | { |
76 | struct vhci_data *vhci = hdev->driver_data; | ||
77 | |||
72 | if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) | 78 | if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) |
73 | return 0; | 79 | return 0; |
74 | 80 | ||
75 | hci_vhci_flush(hdev); | 81 | skb_queue_purge(&vhci->readq); |
82 | |||
76 | return 0; | 83 | return 0; |
77 | } | 84 | } |
78 | 85 | ||
79 | static void hci_vhci_destruct(struct hci_dev *hdev) | 86 | static int vhci_flush(struct hci_dev *hdev) |
80 | { | 87 | { |
81 | struct hci_vhci_struct *vhci; | 88 | struct vhci_data *vhci = hdev->driver_data; |
82 | 89 | ||
83 | if (!hdev) return; | 90 | skb_queue_purge(&vhci->readq); |
84 | 91 | ||
85 | vhci = (struct hci_vhci_struct *) hdev->driver_data; | 92 | return 0; |
86 | kfree(vhci); | ||
87 | } | 93 | } |
88 | 94 | ||
89 | static int hci_vhci_send_frame(struct sk_buff *skb) | 95 | static int vhci_send_frame(struct sk_buff *skb) |
90 | { | 96 | { |
91 | struct hci_dev* hdev = (struct hci_dev *) skb->dev; | 97 | struct hci_dev* hdev = (struct hci_dev *) skb->dev; |
92 | struct hci_vhci_struct *hci_vhci; | 98 | struct vhci_data *vhci; |
93 | 99 | ||
94 | if (!hdev) { | 100 | if (!hdev) { |
95 | BT_ERR("Frame for uknown device (hdev=NULL)"); | 101 | BT_ERR("Frame for unknown HCI device (hdev=NULL)"); |
96 | return -ENODEV; | 102 | return -ENODEV; |
97 | } | 103 | } |
98 | 104 | ||
99 | if (!test_bit(HCI_RUNNING, &hdev->flags)) | 105 | if (!test_bit(HCI_RUNNING, &hdev->flags)) |
100 | return -EBUSY; | 106 | return -EBUSY; |
101 | 107 | ||
102 | hci_vhci = (struct hci_vhci_struct *) hdev->driver_data; | 108 | vhci = hdev->driver_data; |
109 | |||
110 | memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); | ||
111 | skb_queue_tail(&vhci->readq, skb); | ||
103 | 112 | ||
104 | memcpy(skb_push(skb, 1), &skb->pkt_type, 1); | 113 | if (vhci->flags & VHCI_FASYNC) |
105 | skb_queue_tail(&hci_vhci->readq, skb); | 114 | kill_fasync(&vhci->fasync, SIGIO, POLL_IN); |
106 | 115 | ||
107 | if (hci_vhci->flags & VHCI_FASYNC) | 116 | wake_up_interruptible(&vhci->read_wait); |
108 | kill_fasync(&hci_vhci->fasync, SIGIO, POLL_IN); | ||
109 | wake_up_interruptible(&hci_vhci->read_wait); | ||
110 | 117 | ||
111 | return 0; | 118 | return 0; |
112 | } | 119 | } |
113 | 120 | ||
114 | /* Character device part */ | 121 | static void vhci_destruct(struct hci_dev *hdev) |
115 | 122 | { | |
116 | /* Poll */ | 123 | kfree(hdev->driver_data); |
117 | static unsigned int hci_vhci_chr_poll(struct file *file, poll_table * wait) | ||
118 | { | ||
119 | struct hci_vhci_struct *hci_vhci = (struct hci_vhci_struct *) file->private_data; | ||
120 | |||
121 | poll_wait(file, &hci_vhci->read_wait, wait); | ||
122 | |||
123 | if (!skb_queue_empty(&hci_vhci->readq)) | ||
124 | return POLLIN | POLLRDNORM; | ||
125 | |||
126 | return POLLOUT | POLLWRNORM; | ||
127 | } | 124 | } |
128 | 125 | ||
129 | /* Get packet from user space buffer(already verified) */ | 126 | static inline ssize_t vhci_get_user(struct vhci_data *vhci, |
130 | static inline ssize_t hci_vhci_get_user(struct hci_vhci_struct *hci_vhci, const char __user *buf, size_t count) | 127 | const char __user *buf, size_t count) |
131 | { | 128 | { |
132 | struct sk_buff *skb; | 129 | struct sk_buff *skb; |
133 | 130 | ||
134 | if (count > HCI_MAX_FRAME_SIZE) | 131 | if (count > HCI_MAX_FRAME_SIZE) |
135 | return -EINVAL; | 132 | return -EINVAL; |
136 | 133 | ||
137 | if (!(skb = bt_skb_alloc(count, GFP_KERNEL))) | 134 | skb = bt_skb_alloc(count, GFP_KERNEL); |
135 | if (!skb) | ||
138 | return -ENOMEM; | 136 | return -ENOMEM; |
139 | 137 | ||
140 | if (copy_from_user(skb_put(skb, count), buf, count)) { | 138 | if (copy_from_user(skb_put(skb, count), buf, count)) { |
141 | kfree_skb(skb); | 139 | kfree_skb(skb); |
142 | return -EFAULT; | 140 | return -EFAULT; |
143 | } | 141 | } |
144 | 142 | ||
145 | skb->dev = (void *) hci_vhci->hdev; | 143 | skb->dev = (void *) vhci->hdev; |
146 | skb->pkt_type = *((__u8 *) skb->data); | 144 | bt_cb(skb)->pkt_type = *((__u8 *) skb->data); |
147 | skb_pull(skb, 1); | 145 | skb_pull(skb, 1); |
148 | 146 | ||
149 | hci_recv_frame(skb); | 147 | hci_recv_frame(skb); |
150 | 148 | ||
151 | return count; | 149 | return count; |
152 | } | ||
153 | |||
154 | /* Write */ | ||
155 | static ssize_t hci_vhci_chr_write(struct file * file, const char __user * buf, | ||
156 | size_t count, loff_t *pos) | ||
157 | { | ||
158 | struct hci_vhci_struct *hci_vhci = (struct hci_vhci_struct *) file->private_data; | ||
159 | |||
160 | if (!access_ok(VERIFY_READ, buf, count)) | ||
161 | return -EFAULT; | ||
162 | |||
163 | return hci_vhci_get_user(hci_vhci, buf, count); | ||
164 | } | 150 | } |
165 | 151 | ||
166 | /* Put packet to user space buffer(already verified) */ | 152 | static inline ssize_t vhci_put_user(struct vhci_data *vhci, |
167 | static inline ssize_t hci_vhci_put_user(struct hci_vhci_struct *hci_vhci, | 153 | struct sk_buff *skb, char __user *buf, int count) |
168 | struct sk_buff *skb, char __user *buf, | ||
169 | int count) | ||
170 | { | 154 | { |
171 | int len = count, total = 0; | ||
172 | char __user *ptr = buf; | 155 | char __user *ptr = buf; |
156 | int len, total = 0; | ||
157 | |||
158 | len = min_t(unsigned int, skb->len, count); | ||
173 | 159 | ||
174 | len = min_t(unsigned int, skb->len, len); | ||
175 | if (copy_to_user(ptr, skb->data, len)) | 160 | if (copy_to_user(ptr, skb->data, len)) |
176 | return -EFAULT; | 161 | return -EFAULT; |
162 | |||
177 | total += len; | 163 | total += len; |
178 | 164 | ||
179 | hci_vhci->hdev->stat.byte_tx += len; | 165 | vhci->hdev->stat.byte_tx += len; |
180 | switch (skb->pkt_type) { | ||
181 | case HCI_COMMAND_PKT: | ||
182 | hci_vhci->hdev->stat.cmd_tx++; | ||
183 | break; | ||
184 | 166 | ||
185 | case HCI_ACLDATA_PKT: | 167 | switch (bt_cb(skb)->pkt_type) { |
186 | hci_vhci->hdev->stat.acl_tx++; | 168 | case HCI_COMMAND_PKT: |
187 | break; | 169 | vhci->hdev->stat.cmd_tx++; |
170 | break; | ||
171 | |||
172 | case HCI_ACLDATA_PKT: | ||
173 | vhci->hdev->stat.acl_tx++; | ||
174 | break; | ||
188 | 175 | ||
189 | case HCI_SCODATA_PKT: | 176 | case HCI_SCODATA_PKT: |
190 | hci_vhci->hdev->stat.cmd_tx++; | 177 | vhci->hdev->stat.cmd_tx++; |
191 | break; | 178 | break; |
192 | }; | 179 | }; |
193 | 180 | ||
194 | return total; | 181 | return total; |
195 | } | 182 | } |
196 | 183 | ||
197 | /* Read */ | 184 | static loff_t vhci_llseek(struct file * file, loff_t offset, int origin) |
198 | static ssize_t hci_vhci_chr_read(struct file * file, char __user * buf, size_t count, loff_t *pos) | 185 | { |
186 | return -ESPIPE; | ||
187 | } | ||
188 | |||
189 | static ssize_t vhci_read(struct file * file, char __user * buf, size_t count, loff_t *pos) | ||
199 | { | 190 | { |
200 | struct hci_vhci_struct *hci_vhci = (struct hci_vhci_struct *) file->private_data; | ||
201 | DECLARE_WAITQUEUE(wait, current); | 191 | DECLARE_WAITQUEUE(wait, current); |
192 | struct vhci_data *vhci = file->private_data; | ||
202 | struct sk_buff *skb; | 193 | struct sk_buff *skb; |
203 | ssize_t ret = 0; | 194 | ssize_t ret = 0; |
204 | 195 | ||
205 | add_wait_queue(&hci_vhci->read_wait, &wait); | 196 | add_wait_queue(&vhci->read_wait, &wait); |
206 | while (count) { | 197 | while (count) { |
207 | set_current_state(TASK_INTERRUPTIBLE); | 198 | set_current_state(TASK_INTERRUPTIBLE); |
208 | 199 | ||
209 | /* Read frames from device queue */ | 200 | skb = skb_dequeue(&vhci->readq); |
210 | if (!(skb = skb_dequeue(&hci_vhci->readq))) { | 201 | if (!skb) { |
211 | if (file->f_flags & O_NONBLOCK) { | 202 | if (file->f_flags & O_NONBLOCK) { |
212 | ret = -EAGAIN; | 203 | ret = -EAGAIN; |
213 | break; | 204 | break; |
214 | } | 205 | } |
206 | |||
215 | if (signal_pending(current)) { | 207 | if (signal_pending(current)) { |
216 | ret = -ERESTARTSYS; | 208 | ret = -ERESTARTSYS; |
217 | break; | 209 | break; |
218 | } | 210 | } |
219 | 211 | ||
220 | /* Nothing to read, let's sleep */ | ||
221 | schedule(); | 212 | schedule(); |
222 | continue; | 213 | continue; |
223 | } | 214 | } |
224 | 215 | ||
225 | if (access_ok(VERIFY_WRITE, buf, count)) | 216 | if (access_ok(VERIFY_WRITE, buf, count)) |
226 | ret = hci_vhci_put_user(hci_vhci, skb, buf, count); | 217 | ret = vhci_put_user(vhci, skb, buf, count); |
227 | else | 218 | else |
228 | ret = -EFAULT; | 219 | ret = -EFAULT; |
229 | 220 | ||
@@ -231,84 +222,90 @@ static ssize_t hci_vhci_chr_read(struct file * file, char __user * buf, size_t c | |||
231 | break; | 222 | break; |
232 | } | 223 | } |
233 | set_current_state(TASK_RUNNING); | 224 | set_current_state(TASK_RUNNING); |
234 | remove_wait_queue(&hci_vhci->read_wait, &wait); | 225 | remove_wait_queue(&vhci->read_wait, &wait); |
235 | 226 | ||
236 | return ret; | 227 | return ret; |
237 | } | 228 | } |
238 | 229 | ||
239 | static loff_t hci_vhci_chr_lseek(struct file * file, loff_t offset, int origin) | 230 | static ssize_t vhci_write(struct file *file, |
231 | const char __user *buf, size_t count, loff_t *pos) | ||
240 | { | 232 | { |
241 | return -ESPIPE; | 233 | struct vhci_data *vhci = file->private_data; |
242 | } | ||
243 | 234 | ||
244 | static int hci_vhci_chr_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) | 235 | if (!access_ok(VERIFY_READ, buf, count)) |
245 | { | 236 | return -EFAULT; |
246 | return -EINVAL; | 237 | |
238 | return vhci_get_user(vhci, buf, count); | ||
247 | } | 239 | } |
248 | 240 | ||
249 | static int hci_vhci_chr_fasync(int fd, struct file *file, int on) | 241 | static unsigned int vhci_poll(struct file *file, poll_table *wait) |
250 | { | 242 | { |
251 | struct hci_vhci_struct *hci_vhci = (struct hci_vhci_struct *) file->private_data; | 243 | struct vhci_data *vhci = file->private_data; |
252 | int ret; | ||
253 | 244 | ||
254 | if ((ret = fasync_helper(fd, file, on, &hci_vhci->fasync)) < 0) | 245 | poll_wait(file, &vhci->read_wait, wait); |
255 | return ret; | ||
256 | |||
257 | if (on) | ||
258 | hci_vhci->flags |= VHCI_FASYNC; | ||
259 | else | ||
260 | hci_vhci->flags &= ~VHCI_FASYNC; | ||
261 | 246 | ||
262 | return 0; | 247 | if (!skb_queue_empty(&vhci->readq)) |
248 | return POLLIN | POLLRDNORM; | ||
249 | |||
250 | return POLLOUT | POLLWRNORM; | ||
263 | } | 251 | } |
264 | 252 | ||
265 | static int hci_vhci_chr_open(struct inode *inode, struct file * file) | 253 | static int vhci_ioctl(struct inode *inode, struct file *file, |
254 | unsigned int cmd, unsigned long arg) | ||
266 | { | 255 | { |
267 | struct hci_vhci_struct *hci_vhci = NULL; | 256 | return -EINVAL; |
257 | } | ||
258 | |||
259 | static int vhci_open(struct inode *inode, struct file *file) | ||
260 | { | ||
261 | struct vhci_data *vhci; | ||
268 | struct hci_dev *hdev; | 262 | struct hci_dev *hdev; |
269 | 263 | ||
270 | if (!(hci_vhci = kmalloc(sizeof(struct hci_vhci_struct), GFP_KERNEL))) | 264 | vhci = kmalloc(sizeof(struct vhci_data), GFP_KERNEL); |
265 | if (!vhci) | ||
271 | return -ENOMEM; | 266 | return -ENOMEM; |
272 | 267 | ||
273 | memset(hci_vhci, 0, sizeof(struct hci_vhci_struct)); | 268 | memset(vhci, 0, sizeof(struct vhci_data)); |
274 | 269 | ||
275 | skb_queue_head_init(&hci_vhci->readq); | 270 | skb_queue_head_init(&vhci->readq); |
276 | init_waitqueue_head(&hci_vhci->read_wait); | 271 | init_waitqueue_head(&vhci->read_wait); |
277 | 272 | ||
278 | /* Initialize and register HCI device */ | ||
279 | hdev = hci_alloc_dev(); | 273 | hdev = hci_alloc_dev(); |
280 | if (!hdev) { | 274 | if (!hdev) { |
281 | kfree(hci_vhci); | 275 | kfree(vhci); |
282 | return -ENOMEM; | 276 | return -ENOMEM; |
283 | } | 277 | } |
284 | 278 | ||
285 | hci_vhci->hdev = hdev; | 279 | vhci->hdev = hdev; |
286 | 280 | ||
287 | hdev->type = HCI_VHCI; | 281 | hdev->type = HCI_VHCI; |
288 | hdev->driver_data = hci_vhci; | 282 | hdev->driver_data = vhci; |
283 | SET_HCIDEV_DEV(hdev, vhci_miscdev.dev); | ||
289 | 284 | ||
290 | hdev->open = hci_vhci_open; | 285 | hdev->open = vhci_open_dev; |
291 | hdev->close = hci_vhci_close; | 286 | hdev->close = vhci_close_dev; |
292 | hdev->flush = hci_vhci_flush; | 287 | hdev->flush = vhci_flush; |
293 | hdev->send = hci_vhci_send_frame; | 288 | hdev->send = vhci_send_frame; |
294 | hdev->destruct = hci_vhci_destruct; | 289 | hdev->destruct = vhci_destruct; |
295 | 290 | ||
296 | hdev->owner = THIS_MODULE; | 291 | hdev->owner = THIS_MODULE; |
297 | 292 | ||
298 | if (hci_register_dev(hdev) < 0) { | 293 | if (hci_register_dev(hdev) < 0) { |
299 | kfree(hci_vhci); | 294 | BT_ERR("Can't register HCI device"); |
295 | kfree(vhci); | ||
300 | hci_free_dev(hdev); | 296 | hci_free_dev(hdev); |
301 | return -EBUSY; | 297 | return -EBUSY; |
302 | } | 298 | } |
303 | 299 | ||
304 | file->private_data = hci_vhci; | 300 | file->private_data = vhci; |
305 | return nonseekable_open(inode, file); | 301 | |
302 | return nonseekable_open(inode, file); | ||
306 | } | 303 | } |
307 | 304 | ||
308 | static int hci_vhci_chr_close(struct inode *inode, struct file *file) | 305 | static int vhci_release(struct inode *inode, struct file *file) |
309 | { | 306 | { |
310 | struct hci_vhci_struct *hci_vhci = (struct hci_vhci_struct *) file->private_data; | 307 | struct vhci_data *vhci = file->private_data; |
311 | struct hci_dev *hdev = hci_vhci->hdev; | 308 | struct hci_dev *hdev = vhci->hdev; |
312 | 309 | ||
313 | if (hci_unregister_dev(hdev) < 0) { | 310 | if (hci_unregister_dev(hdev) < 0) { |
314 | BT_ERR("Can't unregister HCI device %s", hdev->name); | 311 | BT_ERR("Can't unregister HCI device %s", hdev->name); |
@@ -317,48 +314,71 @@ static int hci_vhci_chr_close(struct inode *inode, struct file *file) | |||
317 | hci_free_dev(hdev); | 314 | hci_free_dev(hdev); |
318 | 315 | ||
319 | file->private_data = NULL; | 316 | file->private_data = NULL; |
317 | |||
320 | return 0; | 318 | return 0; |
321 | } | 319 | } |
322 | 320 | ||
323 | static struct file_operations hci_vhci_fops = { | 321 | static int vhci_fasync(int fd, struct file *file, int on) |
324 | .owner = THIS_MODULE, | 322 | { |
325 | .llseek = hci_vhci_chr_lseek, | 323 | struct vhci_data *vhci = file->private_data; |
326 | .read = hci_vhci_chr_read, | 324 | int err; |
327 | .write = hci_vhci_chr_write, | 325 | |
328 | .poll = hci_vhci_chr_poll, | 326 | err = fasync_helper(fd, file, on, &vhci->fasync); |
329 | .ioctl = hci_vhci_chr_ioctl, | 327 | if (err < 0) |
330 | .open = hci_vhci_chr_open, | 328 | return err; |
331 | .release = hci_vhci_chr_close, | 329 | |
332 | .fasync = hci_vhci_chr_fasync | 330 | if (on) |
331 | vhci->flags |= VHCI_FASYNC; | ||
332 | else | ||
333 | vhci->flags &= ~VHCI_FASYNC; | ||
334 | |||
335 | return 0; | ||
336 | } | ||
337 | |||
338 | static struct file_operations vhci_fops = { | ||
339 | .owner = THIS_MODULE, | ||
340 | .llseek = vhci_llseek, | ||
341 | .read = vhci_read, | ||
342 | .write = vhci_write, | ||
343 | .poll = vhci_poll, | ||
344 | .ioctl = vhci_ioctl, | ||
345 | .open = vhci_open, | ||
346 | .release = vhci_release, | ||
347 | .fasync = vhci_fasync, | ||
333 | }; | 348 | }; |
334 | 349 | ||
335 | static struct miscdevice hci_vhci_miscdev= | 350 | static struct miscdevice vhci_miscdev= { |
336 | { | 351 | .name = "vhci", |
337 | VHCI_MINOR, | 352 | .fops = &vhci_fops, |
338 | "hci_vhci", | ||
339 | &hci_vhci_fops | ||
340 | }; | 353 | }; |
341 | 354 | ||
342 | static int __init hci_vhci_init(void) | 355 | static int __init vhci_init(void) |
343 | { | 356 | { |
344 | BT_INFO("VHCI driver ver %s", VERSION); | 357 | BT_INFO("Virtual HCI driver ver %s", VERSION); |
345 | 358 | ||
346 | if (misc_register(&hci_vhci_miscdev)) { | 359 | vhci_miscdev.minor = minor; |
347 | BT_ERR("Can't register misc device %d\n", VHCI_MINOR); | 360 | |
361 | if (misc_register(&vhci_miscdev) < 0) { | ||
362 | BT_ERR("Can't register misc device with minor %d", minor); | ||
348 | return -EIO; | 363 | return -EIO; |
349 | } | 364 | } |
350 | 365 | ||
351 | return 0; | 366 | return 0; |
352 | } | 367 | } |
353 | 368 | ||
354 | static void hci_vhci_cleanup(void) | 369 | static void __exit vhci_exit(void) |
355 | { | 370 | { |
356 | misc_deregister(&hci_vhci_miscdev); | 371 | if (misc_deregister(&vhci_miscdev) < 0) |
372 | BT_ERR("Can't unregister misc device with minor %d", minor); | ||
357 | } | 373 | } |
358 | 374 | ||
359 | module_init(hci_vhci_init); | 375 | module_init(vhci_init); |
360 | module_exit(hci_vhci_cleanup); | 376 | module_exit(vhci_exit); |
377 | |||
378 | module_param(minor, int, 0444); | ||
379 | MODULE_PARM_DESC(minor, "Miscellaneous minor device number"); | ||
361 | 380 | ||
362 | MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>"); | 381 | MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); |
363 | MODULE_DESCRIPTION("Bluetooth VHCI driver ver " VERSION); | 382 | MODULE_DESCRIPTION("Bluetooth virtual HCI driver ver " VERSION); |
364 | MODULE_LICENSE("GPL"); | 383 | MODULE_VERSION(VERSION); |
384 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/bluetooth/hci_vhci.h b/drivers/bluetooth/hci_vhci.h deleted file mode 100644 index 53b11f9ef76d..000000000000 --- a/drivers/bluetooth/hci_vhci.h +++ /dev/null | |||
@@ -1,50 +0,0 @@ | |||
1 | /* | ||
2 | BlueZ - Bluetooth protocol stack for Linux | ||
3 | Copyright (C) 2000-2001 Qualcomm Incorporated | ||
4 | |||
5 | Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> | ||
6 | |||
7 | This program is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License version 2 as | ||
9 | published by the Free Software Foundation; | ||
10 | |||
11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | ||
12 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
13 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. | ||
14 | IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY | ||
15 | CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES | ||
16 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
17 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
18 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
19 | |||
20 | ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, | ||
21 | COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS | ||
22 | SOFTWARE IS DISCLAIMED. | ||
23 | */ | ||
24 | |||
25 | /* | ||
26 | * $Id: hci_vhci.h,v 1.1.1.1 2002/03/08 21:03:15 maxk Exp $ | ||
27 | */ | ||
28 | |||
29 | #ifndef __HCI_VHCI_H | ||
30 | #define __HCI_VHCI_H | ||
31 | |||
32 | #ifdef __KERNEL__ | ||
33 | |||
34 | struct hci_vhci_struct { | ||
35 | struct hci_dev *hdev; | ||
36 | __u32 flags; | ||
37 | wait_queue_head_t read_wait; | ||
38 | struct sk_buff_head readq; | ||
39 | struct fasync_struct *fasync; | ||
40 | }; | ||
41 | |||
42 | /* VHCI device flags */ | ||
43 | #define VHCI_FASYNC 0x0010 | ||
44 | |||
45 | #endif /* __KERNEL__ */ | ||
46 | |||
47 | #define VHCI_DEV "/dev/vhci" | ||
48 | #define VHCI_MINOR 250 | ||
49 | |||
50 | #endif /* __HCI_VHCI_H */ | ||