Lines Matching full:data
93 static struct urb *bfusb_get_completed(struct bfusb_data *data) in bfusb_get_completed() argument
98 BT_DBG("bfusb %p", data); in bfusb_get_completed()
100 skb = skb_dequeue(&data->completed_q); in bfusb_get_completed()
109 static void bfusb_unlink_urbs(struct bfusb_data *data) in bfusb_unlink_urbs() argument
114 BT_DBG("bfusb %p", data); in bfusb_unlink_urbs()
116 while ((skb = skb_dequeue(&data->pending_q))) { in bfusb_unlink_urbs()
119 skb_queue_tail(&data->completed_q, skb); in bfusb_unlink_urbs()
122 while ((urb = bfusb_get_completed(data))) in bfusb_unlink_urbs()
126 static int bfusb_send_bulk(struct bfusb_data *data, struct sk_buff *skb) in bfusb_send_bulk() argument
129 struct urb *urb = bfusb_get_completed(data); in bfusb_send_bulk()
132 BT_DBG("bfusb %p skb %p len %d", data, skb, skb->len); in bfusb_send_bulk()
137 pipe = usb_sndbulkpipe(data->udev, data->bulk_out_ep); in bfusb_send_bulk()
139 usb_fill_bulk_urb(urb, data->udev, pipe, skb->data, skb->len, in bfusb_send_bulk()
144 skb_queue_tail(&data->pending_q, skb); in bfusb_send_bulk()
149 data->hdev->name, urb, err); in bfusb_send_bulk()
150 skb_unlink(skb, &data->pending_q); in bfusb_send_bulk()
153 atomic_inc(&data->pending_tx); in bfusb_send_bulk()
158 static void bfusb_tx_wakeup(struct bfusb_data *data) in bfusb_tx_wakeup() argument
162 BT_DBG("bfusb %p", data); in bfusb_tx_wakeup()
164 if (test_and_set_bit(BFUSB_TX_PROCESS, &data->state)) { in bfusb_tx_wakeup()
165 set_bit(BFUSB_TX_WAKEUP, &data->state); in bfusb_tx_wakeup()
170 clear_bit(BFUSB_TX_WAKEUP, &data->state); in bfusb_tx_wakeup()
172 while ((atomic_read(&data->pending_tx) < BFUSB_MAX_BULK_TX) && in bfusb_tx_wakeup()
173 (skb = skb_dequeue(&data->transmit_q))) { in bfusb_tx_wakeup()
174 if (bfusb_send_bulk(data, skb) < 0) { in bfusb_tx_wakeup()
175 skb_queue_head(&data->transmit_q, skb); in bfusb_tx_wakeup()
180 } while (test_bit(BFUSB_TX_WAKEUP, &data->state)); in bfusb_tx_wakeup()
182 clear_bit(BFUSB_TX_PROCESS, &data->state); in bfusb_tx_wakeup()
188 struct bfusb_data *data = (struct bfusb_data *) skb->dev; in bfusb_tx_complete() local
190 BT_DBG("bfusb %p urb %p skb %p len %d", data, urb, skb, skb->len); in bfusb_tx_complete()
192 atomic_dec(&data->pending_tx); in bfusb_tx_complete()
194 if (!test_bit(HCI_RUNNING, &data->hdev->flags)) in bfusb_tx_complete()
198 data->hdev->stat.byte_tx += skb->len; in bfusb_tx_complete()
200 data->hdev->stat.err_tx++; in bfusb_tx_complete()
202 read_lock(&data->lock); in bfusb_tx_complete()
204 skb_unlink(skb, &data->pending_q); in bfusb_tx_complete()
205 skb_queue_tail(&data->completed_q, skb); in bfusb_tx_complete()
207 bfusb_tx_wakeup(data); in bfusb_tx_complete()
209 read_unlock(&data->lock); in bfusb_tx_complete()
213 static int bfusb_rx_submit(struct bfusb_data *data, struct urb *urb) in bfusb_rx_submit() argument
219 BT_DBG("bfusb %p urb %p", data, urb); in bfusb_rx_submit()
230 skb->dev = (void *) data; in bfusb_rx_submit()
235 pipe = usb_rcvbulkpipe(data->udev, data->bulk_in_ep); in bfusb_rx_submit()
237 usb_fill_bulk_urb(urb, data->udev, pipe, skb->data, size, in bfusb_rx_submit()
240 skb_queue_tail(&data->pending_q, skb); in bfusb_rx_submit()
245 data->hdev->name, urb, err); in bfusb_rx_submit()
246 skb_unlink(skb, &data->pending_q); in bfusb_rx_submit()
254 static inline int bfusb_recv_block(struct bfusb_data *data, int hdr, unsigned char *buf, int len) in bfusb_recv_block() argument
256 BT_DBG("bfusb %p hdr 0x%02x data %p len %d", data, hdr, buf, len); in bfusb_recv_block()
259 BT_ERR("%s error in block", data->hdev->name); in bfusb_recv_block()
260 kfree_skb(data->reassembly); in bfusb_recv_block()
261 data->reassembly = NULL; in bfusb_recv_block()
270 if (data->reassembly) { in bfusb_recv_block()
271 BT_ERR("%s unexpected start block", data->hdev->name); in bfusb_recv_block()
272 kfree_skb(data->reassembly); in bfusb_recv_block()
273 data->reassembly = NULL; in bfusb_recv_block()
277 BT_ERR("%s no packet type found", data->hdev->name); in bfusb_recv_block()
289 BT_ERR("%s event block is too short", data->hdev->name); in bfusb_recv_block()
299 BT_ERR("%s data block is too short", data->hdev->name); in bfusb_recv_block()
309 BT_ERR("%s audio block is too short", data->hdev->name); in bfusb_recv_block()
317 BT_ERR("%s no memory for the packet", data->hdev->name); in bfusb_recv_block()
321 skb->dev = (void *) data->hdev; in bfusb_recv_block()
324 data->reassembly = skb; in bfusb_recv_block()
326 if (!data->reassembly) { in bfusb_recv_block()
327 BT_ERR("%s unexpected continuation block", data->hdev->name); in bfusb_recv_block()
333 memcpy(skb_put(data->reassembly, len), buf, len); in bfusb_recv_block()
336 hci_recv_frame(data->reassembly); in bfusb_recv_block()
337 data->reassembly = NULL; in bfusb_recv_block()
346 struct bfusb_data *data = (struct bfusb_data *) skb->dev; in bfusb_rx_complete() local
351 BT_DBG("bfusb %p urb %p skb %p len %d", data, urb, skb, skb->len); in bfusb_rx_complete()
353 read_lock(&data->lock); in bfusb_rx_complete()
355 if (!test_bit(HCI_RUNNING, &data->hdev->flags)) in bfusb_rx_complete()
361 data->hdev->stat.byte_rx += count; in bfusb_rx_complete()
380 data->hdev->name); in bfusb_rx_complete()
384 bfusb_recv_block(data, hdr, buf, len); in bfusb_rx_complete()
390 skb_unlink(skb, &data->pending_q); in bfusb_rx_complete()
393 bfusb_rx_submit(data, urb); in bfusb_rx_complete()
395 read_unlock(&data->lock); in bfusb_rx_complete()
400 urb->dev = data->udev; in bfusb_rx_complete()
405 data->hdev->name, urb, err); in bfusb_rx_complete()
409 read_unlock(&data->lock); in bfusb_rx_complete()
414 struct bfusb_data *data = hdev->driver_data; in bfusb_open() local
418 BT_DBG("hdev %p bfusb %p", hdev, data); in bfusb_open()
423 write_lock_irqsave(&data->lock, flags); in bfusb_open()
425 err = bfusb_rx_submit(data, NULL); in bfusb_open()
428 bfusb_rx_submit(data, NULL); in bfusb_open()
433 write_unlock_irqrestore(&data->lock, flags); in bfusb_open()
440 struct bfusb_data *data = hdev->driver_data; in bfusb_flush() local
442 BT_DBG("hdev %p bfusb %p", hdev, data); in bfusb_flush()
444 skb_queue_purge(&data->transmit_q); in bfusb_flush()
451 struct bfusb_data *data = hdev->driver_data; in bfusb_close() local
454 BT_DBG("hdev %p bfusb %p", hdev, data); in bfusb_close()
459 write_lock_irqsave(&data->lock, flags); in bfusb_close()
460 write_unlock_irqrestore(&data->lock, flags); in bfusb_close()
462 bfusb_unlink_urbs(data); in bfusb_close()
471 struct bfusb_data *data; in bfusb_send_frame() local
486 data = hdev->driver_data; in bfusb_send_frame()
512 nskb->dev = (void *) data; in bfusb_send_frame()
529 if ((nskb->len % data->bulk_pkt_size) == 0) { in bfusb_send_frame()
535 read_lock(&data->lock); in bfusb_send_frame()
537 skb_queue_tail(&data->transmit_q, nskb); in bfusb_send_frame()
538 bfusb_tx_wakeup(data); in bfusb_send_frame()
540 read_unlock(&data->lock); in bfusb_send_frame()
549 struct bfusb_data *data = hdev->driver_data; in bfusb_destruct() local
551 BT_DBG("hdev %p bfusb %p", hdev, data); in bfusb_destruct()
553 kfree(data); in bfusb_destruct()
561 static int bfusb_load_firmware(struct bfusb_data *data, in bfusb_load_firmware() argument
567 BT_DBG("bfusb %p udev %p", data, data->udev); in bfusb_load_firmware()
577 pipe = usb_sndctrlpipe(data->udev, 0); in bfusb_load_firmware()
579 if (usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION, in bfusb_load_firmware()
586 data->udev->toggle[0] = data->udev->toggle[1] = 0; in bfusb_load_firmware()
588 pipe = usb_sndbulkpipe(data->udev, data->bulk_out_ep); in bfusb_load_firmware()
595 err = usb_bulk_msg(data->udev, pipe, buf, size, in bfusb_load_firmware()
607 err = usb_bulk_msg(data->udev, pipe, NULL, 0, in bfusb_load_firmware()
614 pipe = usb_sndctrlpipe(data->udev, 0); in bfusb_load_firmware()
616 err = usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION, in bfusb_load_firmware()
623 data->udev->toggle[0] = data->udev->toggle[1] = 0; in bfusb_load_firmware()
633 pipe = usb_sndctrlpipe(data->udev, 0); in bfusb_load_firmware()
635 usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION, in bfusb_load_firmware()
648 struct bfusb_data *data; in bfusb_probe() local
665 data = kzalloc(sizeof(struct bfusb_data), GFP_KERNEL); in bfusb_probe()
666 if (!data) { in bfusb_probe()
671 data->udev = udev; in bfusb_probe()
672 data->bulk_in_ep = bulk_in_ep->desc.bEndpointAddress; in bfusb_probe()
673 data->bulk_out_ep = bulk_out_ep->desc.bEndpointAddress; in bfusb_probe()
674 data->bulk_pkt_size = le16_to_cpu(bulk_out_ep->desc.wMaxPacketSize); in bfusb_probe()
676 rwlock_init(&data->lock); in bfusb_probe()
678 data->reassembly = NULL; in bfusb_probe()
680 skb_queue_head_init(&data->transmit_q); in bfusb_probe()
681 skb_queue_head_init(&data->pending_q); in bfusb_probe()
682 skb_queue_head_init(&data->completed_q); in bfusb_probe()
689 BT_DBG("firmware data %p size %zu", firmware->data, firmware->size); in bfusb_probe()
691 if (bfusb_load_firmware(data, firmware->data, firmware->size) < 0) { in bfusb_probe()
705 data->hdev = hdev; in bfusb_probe()
708 hdev->driver_data = data; in bfusb_probe()
726 usb_set_intfdata(intf, data); in bfusb_probe()
734 kfree(data); in bfusb_probe()
742 struct bfusb_data *data = usb_get_intfdata(intf); in bfusb_disconnect() local
743 struct hci_dev *hdev = data->hdev; in bfusb_disconnect()