Lines Matching full:data
78 static struct urb *bfusb_get_completed(struct bfusb_data *data) in bfusb_get_completed() argument
83 BT_DBG("bfusb %p", data); in bfusb_get_completed()
85 skb = skb_dequeue(&data->completed_q); in bfusb_get_completed()
94 static void bfusb_unlink_urbs(struct bfusb_data *data) in bfusb_unlink_urbs() argument
99 BT_DBG("bfusb %p", data); in bfusb_unlink_urbs()
101 while ((skb = skb_dequeue(&data->pending_q))) { in bfusb_unlink_urbs()
104 skb_queue_tail(&data->completed_q, skb); in bfusb_unlink_urbs()
107 while ((urb = bfusb_get_completed(data))) in bfusb_unlink_urbs()
111 static int bfusb_send_bulk(struct bfusb_data *data, struct sk_buff *skb) in bfusb_send_bulk() argument
114 struct urb *urb = bfusb_get_completed(data); in bfusb_send_bulk()
117 BT_DBG("bfusb %p skb %p len %d", data, skb, skb->len); in bfusb_send_bulk()
125 pipe = usb_sndbulkpipe(data->udev, data->bulk_out_ep); in bfusb_send_bulk()
127 usb_fill_bulk_urb(urb, data->udev, pipe, skb->data, skb->len, in bfusb_send_bulk()
132 skb_queue_tail(&data->pending_q, skb); in bfusb_send_bulk()
136 bt_dev_err(data->hdev, "bulk tx submit failed urb %p err %d", in bfusb_send_bulk()
138 skb_unlink(skb, &data->pending_q); in bfusb_send_bulk()
141 atomic_inc(&data->pending_tx); in bfusb_send_bulk()
146 static void bfusb_tx_wakeup(struct bfusb_data *data) in bfusb_tx_wakeup() argument
150 BT_DBG("bfusb %p", data); in bfusb_tx_wakeup()
152 if (test_and_set_bit(BFUSB_TX_PROCESS, &data->state)) { in bfusb_tx_wakeup()
153 set_bit(BFUSB_TX_WAKEUP, &data->state); in bfusb_tx_wakeup()
158 clear_bit(BFUSB_TX_WAKEUP, &data->state); in bfusb_tx_wakeup()
160 while ((atomic_read(&data->pending_tx) < BFUSB_MAX_BULK_TX) && in bfusb_tx_wakeup()
161 (skb = skb_dequeue(&data->transmit_q))) { in bfusb_tx_wakeup()
162 if (bfusb_send_bulk(data, skb) < 0) { in bfusb_tx_wakeup()
163 skb_queue_head(&data->transmit_q, skb); in bfusb_tx_wakeup()
168 } while (test_bit(BFUSB_TX_WAKEUP, &data->state)); in bfusb_tx_wakeup()
170 clear_bit(BFUSB_TX_PROCESS, &data->state); in bfusb_tx_wakeup()
176 struct bfusb_data *data = (struct bfusb_data *) skb->dev; in bfusb_tx_complete() local
178 BT_DBG("bfusb %p urb %p skb %p len %d", data, urb, skb, skb->len); in bfusb_tx_complete()
180 atomic_dec(&data->pending_tx); in bfusb_tx_complete()
182 if (!test_bit(HCI_RUNNING, &data->hdev->flags)) in bfusb_tx_complete()
186 data->hdev->stat.byte_tx += skb->len; in bfusb_tx_complete()
188 data->hdev->stat.err_tx++; in bfusb_tx_complete()
190 read_lock(&data->lock); in bfusb_tx_complete()
192 skb_unlink(skb, &data->pending_q); in bfusb_tx_complete()
193 skb_queue_tail(&data->completed_q, skb); in bfusb_tx_complete()
195 bfusb_tx_wakeup(data); in bfusb_tx_complete()
197 read_unlock(&data->lock); in bfusb_tx_complete()
201 static int bfusb_rx_submit(struct bfusb_data *data, struct urb *urb) in bfusb_rx_submit() argument
207 BT_DBG("bfusb %p urb %p", data, urb); in bfusb_rx_submit()
221 skb->dev = (void *) data; in bfusb_rx_submit()
226 pipe = usb_rcvbulkpipe(data->udev, data->bulk_in_ep); in bfusb_rx_submit()
228 usb_fill_bulk_urb(urb, data->udev, pipe, skb->data, size, in bfusb_rx_submit()
231 skb_queue_tail(&data->pending_q, skb); in bfusb_rx_submit()
235 bt_dev_err(data->hdev, "bulk rx submit failed urb %p err %d", in bfusb_rx_submit()
237 skb_unlink(skb, &data->pending_q); in bfusb_rx_submit()
245 static inline int bfusb_recv_block(struct bfusb_data *data, int hdr, unsigned char *buf, int len) in bfusb_recv_block() argument
247 BT_DBG("bfusb %p hdr 0x%02x data %p len %d", data, hdr, buf, len); in bfusb_recv_block()
250 bt_dev_err(data->hdev, "error in block"); in bfusb_recv_block()
251 kfree_skb(data->reassembly); in bfusb_recv_block()
252 data->reassembly = NULL; in bfusb_recv_block()
261 if (data->reassembly) { in bfusb_recv_block()
262 bt_dev_err(data->hdev, "unexpected start block"); in bfusb_recv_block()
263 kfree_skb(data->reassembly); in bfusb_recv_block()
264 data->reassembly = NULL; in bfusb_recv_block()
268 bt_dev_err(data->hdev, "no packet type found"); in bfusb_recv_block()
280 bt_dev_err(data->hdev, "event block is too short"); in bfusb_recv_block()
290 bt_dev_err(data->hdev, "data block is too short"); in bfusb_recv_block()
300 bt_dev_err(data->hdev, "audio block is too short"); in bfusb_recv_block()
308 bt_dev_err(data->hdev, "no memory for the packet"); in bfusb_recv_block()
314 data->reassembly = skb; in bfusb_recv_block()
316 if (!data->reassembly) { in bfusb_recv_block()
317 bt_dev_err(data->hdev, "unexpected continuation block"); in bfusb_recv_block()
323 skb_put_data(data->reassembly, buf, len); in bfusb_recv_block()
326 hci_recv_frame(data->hdev, data->reassembly); in bfusb_recv_block()
327 data->reassembly = NULL; in bfusb_recv_block()
336 struct bfusb_data *data = (struct bfusb_data *) skb->dev; in bfusb_rx_complete() local
341 BT_DBG("bfusb %p urb %p skb %p len %d", data, urb, skb, skb->len); in bfusb_rx_complete()
343 read_lock(&data->lock); in bfusb_rx_complete()
345 if (!test_bit(HCI_RUNNING, &data->hdev->flags)) in bfusb_rx_complete()
351 data->hdev->stat.byte_rx += count; in bfusb_rx_complete()
369 bt_dev_err(data->hdev, "block extends over URB buffer ranges"); in bfusb_rx_complete()
372 bfusb_recv_block(data, hdr, buf, len); in bfusb_rx_complete()
378 skb_unlink(skb, &data->pending_q); in bfusb_rx_complete()
381 bfusb_rx_submit(data, urb); in bfusb_rx_complete()
383 read_unlock(&data->lock); in bfusb_rx_complete()
388 urb->dev = data->udev; in bfusb_rx_complete()
392 bt_dev_err(data->hdev, "bulk resubmit failed urb %p err %d", in bfusb_rx_complete()
397 read_unlock(&data->lock); in bfusb_rx_complete()
402 struct bfusb_data *data = hci_get_drvdata(hdev); in bfusb_open() local
406 BT_DBG("hdev %p bfusb %p", hdev, data); in bfusb_open()
408 write_lock_irqsave(&data->lock, flags); in bfusb_open()
410 err = bfusb_rx_submit(data, NULL); in bfusb_open()
413 bfusb_rx_submit(data, NULL); in bfusb_open()
416 write_unlock_irqrestore(&data->lock, flags); in bfusb_open()
423 struct bfusb_data *data = hci_get_drvdata(hdev); in bfusb_flush() local
425 BT_DBG("hdev %p bfusb %p", hdev, data); in bfusb_flush()
427 skb_queue_purge(&data->transmit_q); in bfusb_flush()
434 struct bfusb_data *data = hci_get_drvdata(hdev); in bfusb_close() local
437 BT_DBG("hdev %p bfusb %p", hdev, data); in bfusb_close()
439 write_lock_irqsave(&data->lock, flags); in bfusb_close()
440 write_unlock_irqrestore(&data->lock, flags); in bfusb_close()
442 bfusb_unlink_urbs(data); in bfusb_close()
450 struct bfusb_data *data = hci_get_drvdata(hdev); in bfusb_send_frame() local
482 nskb->dev = (void *) data; in bfusb_send_frame()
499 if ((nskb->len % data->bulk_pkt_size) == 0) { in bfusb_send_frame()
505 read_lock(&data->lock); in bfusb_send_frame()
507 skb_queue_tail(&data->transmit_q, nskb); in bfusb_send_frame()
508 bfusb_tx_wakeup(data); in bfusb_send_frame()
510 read_unlock(&data->lock); in bfusb_send_frame()
517 static int bfusb_load_firmware(struct bfusb_data *data, in bfusb_load_firmware() argument
523 BT_DBG("bfusb %p udev %p", data, data->udev); in bfusb_load_firmware()
533 pipe = usb_sndctrlpipe(data->udev, 0); in bfusb_load_firmware()
535 if (usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION, in bfusb_load_firmware()
542 data->udev->toggle[0] = data->udev->toggle[1] = 0; in bfusb_load_firmware()
544 pipe = usb_sndbulkpipe(data->udev, data->bulk_out_ep); in bfusb_load_firmware()
551 err = usb_bulk_msg(data->udev, pipe, buf, size, in bfusb_load_firmware()
563 err = usb_bulk_msg(data->udev, pipe, NULL, 0, in bfusb_load_firmware()
570 pipe = usb_sndctrlpipe(data->udev, 0); in bfusb_load_firmware()
572 err = usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION, in bfusb_load_firmware()
579 data->udev->toggle[0] = data->udev->toggle[1] = 0; in bfusb_load_firmware()
589 pipe = usb_sndctrlpipe(data->udev, 0); in bfusb_load_firmware()
591 usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION, in bfusb_load_firmware()
604 struct bfusb_data *data; in bfusb_probe() local
621 data = devm_kzalloc(&intf->dev, sizeof(struct bfusb_data), GFP_KERNEL); in bfusb_probe()
622 if (!data) in bfusb_probe()
625 data->udev = udev; in bfusb_probe()
626 data->bulk_in_ep = bulk_in_ep->desc.bEndpointAddress; in bfusb_probe()
627 data->bulk_out_ep = bulk_out_ep->desc.bEndpointAddress; in bfusb_probe()
628 data->bulk_pkt_size = le16_to_cpu(bulk_out_ep->desc.wMaxPacketSize); in bfusb_probe()
630 if (!data->bulk_pkt_size) in bfusb_probe()
633 rwlock_init(&data->lock); in bfusb_probe()
635 data->reassembly = NULL; in bfusb_probe()
637 skb_queue_head_init(&data->transmit_q); in bfusb_probe()
638 skb_queue_head_init(&data->pending_q); in bfusb_probe()
639 skb_queue_head_init(&data->completed_q); in bfusb_probe()
646 BT_DBG("firmware data %p size %zu", firmware->data, firmware->size); in bfusb_probe()
648 if (bfusb_load_firmware(data, firmware->data, firmware->size) < 0) { in bfusb_probe()
662 data->hdev = hdev; in bfusb_probe()
665 hci_set_drvdata(hdev, data); in bfusb_probe()
681 usb_set_intfdata(intf, data); in bfusb_probe()
694 struct bfusb_data *data = usb_get_intfdata(intf); in bfusb_disconnect() local
695 struct hci_dev *hdev = data->hdev; in bfusb_disconnect()